我嘗試32位PNG文件轉換爲16位的文件格式,我知道如何轉換海誓山盟(如RGB565 RGBA4444)之間的16種文件格式但是我不知道如何去從32位轉換到16位。OpenGL的C++:如何將32位png文件轉換爲16位565RGB文件
我的主要問題是:如何查找32位png如何存儲(每個8位分配給R,B,G和A值)?
我該如何失去精度但仍保持大致相同的值?
在此先感謝
我嘗試32位PNG文件轉換爲16位的文件格式,我知道如何轉換海誓山盟(如RGB565 RGBA4444)之間的16種文件格式但是我不知道如何去從32位轉換到16位。OpenGL的C++:如何將32位png文件轉換爲16位565RGB文件
我的主要問題是:如何查找32位png如何存儲(每個8位分配給R,B,G和A值)?
我該如何失去精度但仍保持大致相同的值?
在此先感謝
我不熟悉的32位PNG像素的確切佈局,但假設它是你可能想要做類似的事情到此等格式比較一致:
// Get the pixel from the png:
unsigned int pngPixel = getPngPixel();
unsigned char r = (pngPixel & 0xFF000000) >> 24;
unsigned char g = (pngPixel & 0x00FF0000) >> 16;
unsigned char b = (pngPixel & 0x0000FF00) >> 8;
unsigned char a = (pngPixel & 0x000000FF);
// you can collapse this to one line, but for clarity...
// masking off the least significant bits.
unsigned short rgb565Pixel = (r & 0xF8) << 11;
rgb565Pixel |= (g & 0xFC) << 5;
rgb565Pixel |= (b & 0xF8);
// Again you could collapse this down to one line, but for clarity...
// masking off the least significant bits.
unsigned short rgba4Pixel = (r & 0xF0) << 12;
rgba4Pixel |= (g & 0xF0) << 8;
rgba4Pixel |= (b & 0xF0) << 4;
rgba4Pixel |= (a & 0xF0);
考慮這個僞代碼。
有人可能會說,從8位轉換爲4位的時候屏蔽掉至少顯著位,特別是,是不是在兩者之間轉換一個很好的方法,他們會是正確的。你可以使用轉換功能:
unsigned int convertColor(unsigned char c, unsigned int oldMax, unsigned int newMax) {
double oldColor = c;
double percentOfMax = oldColor/oldMax;
return ((unsigned int)(newMax * percentOfMax)) & newMax;
}
// now we can do this
unsigned short rgba4Pixel = convertColor(r, 0xFF, 0x0F) << 12;
rgba4Pixel |= convertColor(g, 0xFF, 0x0F) << 8;
rgba4Pixel |= convertColor(b, 0xFF, 0x0F) << 4;
rgba4Pixel |= convertColor(a, 0xFF, 0x0F);
PNG的是* *壓縮。這是他們的觀點。他們不將數據存儲在簡單的32位RGBA格式中。 – 2012-02-22 04:37:39
我猜我錯過了那一點。我以爲他已經解壓縮了png。 – grieve 2012-02-22 04:46:27
這實在是兩個問題:1)我該如何解壓縮PNG?和2)如何將32位顏色轉換爲16位顏色? #1的答案是使用libpng。如果您「想要了解」這一點,那麼您必須閱讀[PNG規範文檔](http://www.libpng.org/pub/png/spec/)。解壓縮PNG並不是一件簡單的事情。 PNG是壓縮圖像;他們以壓縮形式存儲信息。所以閱讀它們很複雜。這就是爲什麼幾乎所有讀取PNG的工具都使用libpng來解壓縮它們。 – 2012-02-22 04:40:58