4

8 bpp のインデックス付きビットマップを RGB ビットマップに変換しようとしていますが、成功していません。

最初の問題は、によって返されるパレットにGetPalette()256 個の一意の数字が含まれていないことです。

これまでの私のコードは次のとおりです。

BitmapData bitmapData;
int paletteSize =b->GetPaletteSize();
ColorPalette colorPalette;
b->GetPalette(&colorPalette,paletteSize/4);
b->LockBits(new Gdiplus::Rect(0,0,b->GetWidth(),b->GetHeight()),0,b->GetPixelFormat(),&bitmapData);
char* scan0 = (char*)bitmapData.Scan0; 
width = b->GetWidth();              
height = b->GetHeight();                
stride =  bitmapData.Width*4;               
pBitmapData = new char[stride*height];          
DWORD B = 0x00FF0000;                               
DWORD G =0x0000FF00;                                    
DWORD R = 0x000000FF;                                       
int currentIndex=0;                                             
for(int i = 0 ; i < height; i++)                                            
{                                                                                   
    for(int j =0 ; j < width; j++)                                                                  
    {                                                                                                           
        std::stringstream ss;                                                                                               
        currentIndex = i*stride+j*3;                                                                                                    
        pBitmapData[currentIndex+1]= (colorPalette.Entries[scan0[i*width+j]]&&B)>>16;
        pBitmapData[currentIndex+2]= (colorPalette.Entries[scan0[i*width+j]]&&G)>>8;                                                                
        pBitmapData[currentIndex+3]= (colorPalette.Entries[scan0[i*width+j]]&&R);
    }                                                                                                                                                       
}                                                                                                                                                               
b->UnlockBits(&bitmapData); 

どうすればこれを修正できますか?

4

3 に答える 3

1

BITMAP RIFF フォーマットの各部分を正しく入力して整列させることが非常に重要です。パレット タイプのビットマップのパレットには、256 のエントリが含まれている必要はありません: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx

"8 ビットマップには最大 256 色があり、BITMAPINFO の bmiColors メンバーには最大256 エントリが含まれます。この場合、配列の各バイトは 1 つのピクセルを表します。"

ただし、重要なことは、パレット内のエントリが 256 未満の場合、ビットマップはパレット構造からインデックス化されるべきではないということです。そうしないと、ソースが正しくフォーマットされません。

24 bpp ビットマップを変換したいとします。これは 8bpp とは少し異なります。既存の 24bpp および 8bpp ビットマップ ファイルを 16 進エディターで開き、構造がどの程度正確に配置されているか、そこに何があるかを確認し、メモリ レイアウトと比較することをお勧めします。

于 2013-09-02T18:19:15.707 に答える
1

これはいけません:

currentIndex = i*stride+j*3;

なれ:

currentIndex = i*stride+j*4;

とすれば:

stride =  bitmapData.Width*4;

また:

(colorPalette.Entries[scan0[i*width+j]]&&B)>>16;

次のようにする必要があります。

(colorPalette.Entries[scan0[i*width+j]] & B)>>16;

Double&&は「左右が true の場合」を意味し、single&は「ビットごとの AND」を意味します。

于 2013-09-02T18:25:13.523 に答える