私はc++を使用していくつかの画像作業を行っていますが、jpeg圧縮ファイルを使用できるようにしたいと考えています。GDI +ライブラリには必要なものが含まれているようです。具体的には、Gdiplus :: Bitmap :: GetPixel()ルーチンが最終的に使用したいものです。
いくつかのGdiplus::Bitmapコンストラクターがあり、私が使用したいものは、BITMAPINFO構造体と画像ビットへのポインターを取ります。Bitmap.Bitmap(const BITMAPINFO * lpbmi、VOID * lpbits)私はすでにフックされたStretchDIBits() からこの情報を持っているので、元のBITMAPを作成していません。ただし、圧縮はビットマップのJPEGに設定されているため(BITMAPINFO.BITMAPINFOHEADER.biCompression = BI_JPEG)、解析が容易ではなく、方法がわからないか、jpeg解凍アルゴリズムを作成したいと考えています。
以下は、GDI +ライブラリを活用して、jpeg圧縮画像の個々のピクセルを確認できるようにするために使用しているコードです。
// lpbmi and lpBits come from a hooked StretchDIBits call. I did not generate this data.
// The following is some sample data that i've seen go in and not work:
//
// lpbmi->bmiHeader.biSize = 40
// lpbmi->bmiHeader.biWidth = 1299
// lpbmi->bmiHeader.biHeight = -1
// lpbmi->bmiHeader.biPlanes = 1
// lpbmi->bmiHeader.biBitCount = 0
// lpbmi->bmiHeader.biCompression = 4 // resolves to BI_JPEG
// lpbmi->bmiHeader.biSizeImage = 955
// lpbmi->bmiHeader.biXpelsPerMeter = 0
// lpbmi->bmiHeader.biYpelsPerMeter = 0
// lpbmi->bmiHeader.biClrUsed = 0
// lpbmi->bmiHeader.biClrImportant = 0
//
// This data looks valid to me, so i don't know why nothing happens when trying to convert
// it into a Gdiplus::Bitmap
void SomeMethod(const BITMAPINFO * lpbmi, const void * lpBits)
{
// Apparently, this is needed before using GDI+ libraries. I experimented
// without this and nothing different happend. Not even a crash.
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// Because the BitmapClass doesn't take in a (const void *), I have to copy the data
// into another array. Not much i can do about it because i'm given lpBits as a
// (const void *)
void * data = malloc(lpbmi->bmiHeader.biSizeImage);
memcpy(data, lpBits, lpbmi->bmiHeader.biSizeImage);
// I "expect" that this bascially reads in the data provided and creates our
// Bitmap class.
Bitmap bitmap(lpbmi, data);
// The problem is, Width and Height are always 0. Can't figure out why.
UINT Width = bitmap->GetWidth(); // Why always 0????
UINT Height = bitmap->GetHeight(); // Why always 0????
//////////////////////
// Some more code ...
//////////////////////
}
Gdiplus :: Bitmapクラスが私が提供しているデータに対して何もしない理由を誰かが知っていますか?