2012-02-22 103 views
0

我嘗試32位PNG文件轉換爲16位的文件格式,我知道如何轉換海誓山盟(如RGB565 RGBA4444)之間的16種文件格式但是我不知道如何去從32位轉換到16位。OpenGL的C++:如何將32位png文件轉換爲16位565RGB文件

我的主要問題是:如何查找32位png如何存儲(每個8位分配給R,B,G和A值)?

我該如何失去精度但仍保持大致相同的值?

在此先感謝

+1

這實在是兩個問題: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

回答

1

你會好得多使用libpng比手工實現這一點。

+0

這是我想了解,雖然 – James 2012-02-22 03:42:48

0

我不熟悉的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); 
+0

PNG的是* *壓縮。這是他們的觀點。他們不將數據存儲在簡單的32位RGBA格式中。 – 2012-02-22 04:37:39

+0

我猜我錯過了那一點。我以爲他已經解壓縮了png。 – grieve 2012-02-22 04:46:27

相關問題