質問させていただきます。よろしくお願いします。
当方の開発環境はWindows XP Visual Stadio C++ 6.0です。
ビットマップ画像をjpg形式に変換した際に、赤と青が反転してしまいます。
以下に作成したものの中で原因となっていそうなものを示しますので、ご指摘等あればよろしくお願いします。
HBITMAP CreateWindowBitmap(HWND hWnd)
{
HBITMAP hbmNew;
HDC hDC, hMemDC;
HGDIOBJ hbmOld;
RECT rc;
SIZE siz;
DWORD dwError;
BITMAPINFO bi;
VOID *pvBits;
GetWindowRect(hWnd, &rc);
siz.cx = rc.right - rc.left;
siz.cy = rc.bottom - rc.top;
hbmNew = NULL;
hDC = GetWindowDC(hWnd);
if (hDC != NULL)
{
hMemDC = CreateCompatibleDC(hDC);
if (hMemDC != NULL)
{
ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = siz.cx;
bi.bmiHeader.biHeight = siz.cy;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
hbmNew = CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pvBits,
NULL, 0);
if (hbmNew != NULL)
{
hbmOld = SelectObject(hMemDC, hbmNew);
BitBlt(hMemDC, 0, 0, siz.cx, siz.cy,
hDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hbmOld);
}
else
dwError = GetLastError();
DeleteDC(hMemDC);
}
else
dwError = GetLastError();
ReleaseDC(hWnd, hDC);
SetLastError(dwError);
}
return hbmNew;
}
typedef struct tagBITMAPINFOEX
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
} BITMAPINFOEX, FAR * LPBITMAPINFOEX;
BOOL SaveBitmapToFile(LPCTSTR pszFileName, HBITMAP hbm)
{
BOOL f;
DWORD dwError;
BITMAPFILEHEADER bf;
BITMAPINFOEX bi;
BITMAPINFOHEADER *pbmih;
DWORD cb;
DWORD cColors, cbColors;
HDC hDC;
HANDLE hFile;
LPVOID pBits;
BITMAP bm;
if (!GetObject(hbm, sizeof(BITMAP), &bm))
return FALSE;
pbmih = &bi.bmiHeader;
ZeroMemory(pbmih, sizeof(BITMAPINFOHEADER));
pbmih->biSize = sizeof(BITMAPINFOHEADER);
pbmih->biWidth = bm.bmWidth;
pbmih->biHeight = bm.bmHeight;
pbmih->biPlanes = 1;
pbmih->biBitCount = bm.bmBitsPixel;
pbmih->biCompression = BI_RGB;
pbmih->biSizeImage = bm.bmWidthBytes * bm.bmHeight;
if (bm.bmBitsPixel < 16)
cColors = 1 << bm.bmBitsPixel;
else
cColors = 0;
cbColors = cColors * sizeof(RGBQUAD);
bf.bfType = 0x4d42;
bf.bfReserved1 = 0;
bf.bfReserved2 = 0;
cb = sizeof(BITMAPFILEHEADER) + pbmih->biSize + cbColors;
bf.bfOffBits = cb;
bf.bfSize = cb + pbmih->biSizeImage;
pBits = HeapAlloc(GetProcessHeap(), 0, pbmih->biSizeImage);
if (pBits == NULL)
return FALSE;
f = FALSE;
hDC = GetDC(NULL);
if (hDC != NULL)
{
if (GetDIBits(hDC, hbm, 0, bm.bmHeight, pBits, (BITMAPINFO*)&bi,
DIB_RGB_COLORS))
{
hFile = CreateFile(pszFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_WRITE_THROUGH, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
f = WriteFile(hFile, &bf, sizeof(BITMAPFILEHEADER), &cb, NULL) &&
WriteFile(hFile, &bi, sizeof(BITMAPINFOHEADER), &cb, NULL) &&
WriteFile(hFile, bi.bmiColors, cbColors, &cb, NULL) &&
WriteFile(hFile, pBits, pbmih->biSizeImage, &cb, NULL);
if (!f)
dwError = GetLastError();
CloseHandle(hFile);
if (!f)
DeleteFile(pszFileName);
}
else
dwError = GetLastError();
}
else
dwError = GetLastError();
ReleaseDC(NULL, hDC);
}
else
dwError = GetLastError();
HeapFree(GetProcessHeap(), 0, pBits);
SetLastError(dwError);
return f;
}
さらに、以下にヘッダファイル内の色についての記述も示しますので、こちらも見ていただけたら幸いです。
#define RGB_RED 2 /* Offset of Red in an RGB scanline element */
#define RGB_GREEN 1 /* Offset of Green */
#define RGB_BLUE 0 /* Offset of Blue */
#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
> ビットマップ画像をjpg形式に変換した際に、赤と青が反転してしまいます。
jpeg 変換で問題が起こってるのなら bmp 変換処理部のコード載せても意味無くね?
> さらに、以下にヘッダファイル内の色についての記述も示しますので
このスレでは libjpeg を利用している事については一切触れてない。なのに、いきなり libjpeg 関連のコードを貼り付けても意味不明じゃね?
出せる情報はきちんと出して回答に廻る側と共有した方が最終的に得となるよ。多分
> #define RGB_RED 2 /* Offset of Red in an RGB scanline element */
> #define RGB_GREEN 1 /* Offset of Green */
> #define RGB_BLUE 0 /* Offset of Blue */
・↑記述はどの段階で変えた? libjpeg.libをコンパイルする時に変えた? libjpeg.libを作成後(アプリにlinkする段階で)変えても意味は無いよ。
・↑記述に変えたなら、アプリから libjpeg にピクセル情報を渡す際は BGR の並びで渡してる? RGB の並びで渡してたら当然 RB 要素は入れ替わるよ。
・jpegのカラースペースは YCbCr で良いの? ↑が使われるのは YCbCr 絡みの時だけなので、CMYK はもちろん、RGB 色空間への変換とかでは意味無いよ。
libjpeg を使っているという前提で、思いついた事を羅列してみた。
gakさんありがとうございます。
ご指摘のとおりlibjpeg.libを作成しなおしてみたら解決しました。
またよろしくお願いします。
ツイート | ![]() |