0

GDI+ 画像データ型の内部に画像 (.png) を格納しています。メモリ DC 内の GDI+ 画像変数に格納された画像データを取得する方法を誰か教えてもらえますか?

ここにいくつかのコードがあります:

Graphics graphics(hdc);
Image image(pStream);

int image_width;
int image_height;

image_width= image.GetWidth();
image_height=image.GetHeight();

graphics.DrawImage(&image, posX,posY, image_width, image_height);    

目的は、この GDI+ イメージをダブル バッファリングできるようにすることです (アニメーションのために!)。

GDI でダブル バッファリングする方法は知っていますが、GDI+ では知りません。GDI では、HBITMAP をメモリ DC に選択するだけですが、GDI+ では、画像は HBITAP ではなく、画像変数に含まれます。HBITMAP ではないイメージをメモリ DC に取得する方法を誰か教えてもらえますか? ありがとうございました。

4

2 に答える 2

0

Bitmap授業は見ましたか?これは Image から継承され、生の画像データへのアクセスに使用できます。

Bitmap bmp(pStream);
BitmapData bitmapData;
Rect rect(0, 0, 200, 200);
// lock area of the image for writing
bmp.LockBits(&rect, ImageLockModeWrite, PixelFormat32bppARGB, &bitmapData);

更新HBITMAP を取得するには、次のようなものを使用できます (注: 以下のコードはテストしていません)。

   HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height);
   BITMAPINFO bmi;
   bmi.bmiHeader.biSize =  sizeof(BITMAPINFOHEADER);
   bmi.bmiHeader.biWidth = width;
   bmi.bmiHeader.biHeight = height;
   bmi.bmiHeader.biPlanes = 1;
   bmi.bmiHeader.biBitCount = 24;
   bmi.bmiHeader.biCompression = BI_RGB;
   bmi.bmiHeader.biSizeImage = 0;
   bmi.bmiHeader.biXPelsPerMeter = 0;
   bmi.bmiHeader.biYPelsPerMeter = 0;
   bmi.bmiHeader.biClrUsed = 0;
   bmi.bmiHeader.biClrImportant = 0;
   bmi.bmiColors = NULL;

   SetDIBits(hdc, hbmp, 0, height,  bitmapData.Scan0, &bmi, 0);
于 2012-11-19T06:26:30.993 に答える
0

ディスクから画像をロードするために使用するコードは次のとおりです。

// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
HBITMAP mLoadImg(WCHAR *szFilename)
{
   HBITMAP result=NULL;

   Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
   bitmap->GetHBITMAP(NULL, &result);
   delete bitmap;
   return result;
}

編集: いくつかの基本的な機能を除いて、GDI+ を自分で使用しないでください。画像を使用するときはいつでも、可能な限り最小で最速のコードが必要です.GDIはこの仕事をうまくやってくれます.

そして、クラス変数のあいまいさを (できれば) 回避するために、透明なピクセルを含む画像を表示するクラスから切り取ったコードを次に示します。これにはクラス定義が含まれています。

void CStaticImg::displayImage()
{
    RECT myRect;
    BITMAP bm;
    HDC screenDC, memDC;
    HBITMAP oldBmp;
    BLENDFUNCTION bf;

    GetObject(mBmp, sizeof(bm), &bm);

    bf.BlendOp = AC_SRC_OVER;
    bf.BlendFlags = 0;
    bf.SourceConstantAlpha = 0xff;

    bf.AlphaFormat = AC_SRC_ALPHA;

    screenDC = GetDC(mHwnd);
    GetClientRect(mHwnd, &myRect);

    if (mBmp == NULL)
        FillRect(screenDC, &myRect, WHITE_BRUSH);

    else
    {
        memDC = CreateCompatibleDC(screenDC);
        oldBmp = (HBITMAP)SelectObject(memDC, mBmp);
        AlphaBlend (screenDC, 0, 0, myRect.right,myRect.bottom, memDC, 0, 0, bm.bmWidth,bm.bmHeight, bf);
        SelectObject(memDC, oldBmp);
        DeleteDC(memDC);
        ReleaseDC(mHwnd, screenDC);
    }
}

class CStaticImg
{
public:
    CStaticImg();
    ~CStaticImg();
    void setImg(HBITMAP img);
    HBITMAP getImgCopy();
    void attach(HWND tgt);
    void detach();
    void setBkMode(bool transparent);

protected:
    HWND mHwnd;
    HBITMAP mBmp;
    WNDPROC mOldWndProc;
    void displayImage();
    virtual LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    bool isBkgTransparent;
private:
//    virtual LRESULT onPaint();
    LRESULT onCreate();
    static CStaticImg *GetObjectFromWindow(HWND hWnd);
    static LRESULT CALLBACK stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
于 2012-11-20T07:30:38.020 に答える