我有一个图像(.png)存储在GDI+图像数据类型中。有人能告诉我如何将图像数据存储在内存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,只需在内存DC中选择一个HBITMAP,但是,使用GDI+,映像不是在HBITAP中,而是在图像变量中。有人能告诉我如何将不是HBITMAP的图像输入内存DC吗?谢谢。
发布于 2012-11-20 07:30:38
下面是从磁盘加载图像的代码。
// 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-19 06:26:30
你看过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);https://stackoverflow.com/questions/13447693
复制相似问题