Avatar billede mollevp Nybegynder
01. december 2005 - 19:08 Der er 3 kommentarer og
1 løsning

Convert 16bit RGB til 24 bit RGB

Hej jeg har noget billede data som er gemt i en 16 bit RGB (565) som jeg skal have lavet om til 24 bit (normal 888).. Jeg kan simplethen bare ikke få det til at virke.. Jeg har gennemsøgt google men uden held.. Findes der ikke en standard måde at konvertere mellem de to formater?

Jeg har forsøgt meget forskellige.. men min farver bliver aldrig gode.. jeg har prøvet et andet program det godt kan lave pæne farver - nogle der har en ide til hvilken teknik han måske kunne bruge..

Jeg er klar over at der er gået info tabt i konverteringen fra 24 til 16, men mit billede er så grimt at det næsten må være en fejl..
Avatar billede arne_v Ekspert
01. december 2005 - 19:14 #1
nu kender jeg ikke meget til farver men 565->888 må være

v888 = (v565 & 0x001F) | ((v565 >> 5) & 0x003F) | ((v565 >> 11) & 0x001F);
Avatar billede mollevp Nybegynder
01. december 2005 - 20:41 #2
Hej arne tak for svaret, jeg har ikke lige tjekket det, men det er nok oxo rigtigt.. jeg fandt problemet - jeg have følgende:
   
        public final void rawEncoding(int xpos, int ypos, int width, int height ) throws IOException
    {
    int totalPixels = width * height;
           
    dataIn.readFully(input, 0, totalPixels*2);
   
    int j = 0;
    for(int k = 0; k < totalPixels; ++k)
    {   
        pixels[k] = ReceiveThread.getColor((input[j]<<8) | input[j+1]);
        j += 2;
    }
   
    RFBView.rfbRef.setImage(pixels,width,height, xpos, ypos);

    }
Hvor getColor er:

  private final static int getColor(int px)
    {
    return ((0xF800 & px) << 8) | ((0x7E0 & px) << 5) | ((0x1F & px) << 3);
    }

Og det virkede ikke oxo, så ændrede jeg det til:

    public final void rawEncoding(int xpos, int ypos, int width, int height ) throws IOException
    {
    int totalPixels = width * height;
           
    dataIn.readFully(input, 0, totalPixels*2);
   
    int j = 0;
    for(int k = 0; k < totalPixels; ++k)
    {   
        pixels[k] = ReceiveThread.getColor(((input[j]&0xFF)<<8) | (input[j+1]&0xFF));
        j += 2;
    }
   
    RFBView.rfbRef.setImage(pixels,width,height, xpos, ypos);

    }

bemærk de to &0xFF på hver byte.. det var simplethen nogle garbage bits eller sådan noget der fik det til at gå galt..

Er der nogle der kan komme med optimerings ideer, ville det være fedt!
Det er til J2ME, MIDP 2.0..

Arne du må gerne smide et svar.
Avatar billede arne_v Ekspert
02. december 2005 - 03:23 #3
jeg forstår ikke en lyd af af den kode men hvis du vil have et svar så fint
Avatar billede jakoba Nybegynder
05. december 2005 - 15:15 #4
mon ikke problemet er her:
  (0xF800 & px) << 8
den øverste bit (sign bit) i den 16 bit værdi (short) er 1 så det er et negativt tal og extendes til 0xFFFFF800 i en 32 bit int.
prøv istedet:
  (0x0F800 & px) << 8
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester