0

24ビットビットマップを、それが構成されているピクセルの16進文字列表現に変換するための次のアルゴリズムがあります。

// *data = previously returned data from a call to GetDIBits
// width = width of bmp
// height = height of bmp
void BitmapToString(BYTE *data, int width, int height)
{
    int total = 4*width*height;
    int i;
    CHAR buf[3];
    DWORD dwWritten = 0;
    HANDLE hFile = CreateFile(TEXT("out.txt"), GENERIC_READ | GENERIC_WRITE, 
                                0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    for(i = 0; i < total; i++)
    {
        SecureZeroMemory(buf, 3);
        wsprintfA(buf, "%.2X", data[i]);

        // only write the 2 characters and not the null terminator:
        WriteFile(hFile, buf, 2, &dwWritten, NULL);

    }
    WriteFile(hFile, "\0", 2, &dwWritten, NULL);
    CloseHandle(hFile);
}

問題は、各行の終わりのパディングを無視したいということです。たとえば、すべてのピクセルの値が#7f7f7fである2x2ビットマップの場合、out.txtのコンテンツにはパディングバイトも含まれます。

7F7F7F7F7F7F00007F7F7F7F7F7F0000

パディングゼロが含まれないようにループを調整するにはどうすればよいですか?

4

1 に答える 1

1

書き込み時に16バイトにパディングしないようにプロジェクト設定を変更することは1つのアイデアです。もう1つは、パッドが設定されているバイト数(この例では16)を知り、モジュラス(またはおよび)を使用して、行ごとにスキップする必要のあるバイト数を決定することです。

  int offset = 0;
  for(i = 0; i < height; i++)
  {
    // only read 3 sets of bytes as the 4th is padding.
    for(j = 0; j < width*3; j++)
    {
        SecureZeroMemory(buf, 3);
        wsprintfA(buf, "%.2X", data[offset]);

        // only write the 2 characters and not the null terminator:
        WriteFile(hFile, buf, 2, &dwWritten, NULL);
        offset++;
    }

    // offset past pad bytes
    offset += offset % 8;
  }

このソリューションは機能するはずですが、パッドバイトが発生していることをさらに理解せずに保証することはできません。

于 2013-03-07T18:23:57.797 に答える