24位的 位图是最简单的位图格式,因为它没有调色板,所有的颜色值直接存储在该颜色位置上(比如(0,0)位置上是0xFFFFFF 白色),而其他格式 存在调色板,每一个颜色位置上存储的是响应的偏移,所以必须先通过位置读出偏移然后在到条色板上定位颜色,才可以找到相应的颜色值,原理懂了代码就不难了!
CRect rc;
GetClientRect(rc);
CImage image;
imageLoad(_T("c:\\1jpg")); //文件路径
if (imageGetBPP() == 32)
{
int i; int j;
for (i = 0; i < imageGetWidth(); i++)
{
for (j = 0; j < imageGetHeight(); j++)
{
byte pByte = (byte )imageGetPixelAddress(i, j);
pByte[0] = pByte[0] pByte[3] / 255;
pByte[1] = pByte[1] pByte[3] / 255;
pByte[2] = pByte[2] pByte[3] / 255;
}
}
}
imageDraw(GetDC()->m_hDC, rc); //dc,rc 可换成控件的,试试
哪有那么复杂,只要用CImage的PlgBlt方法就可以解决90度,180度和反转的问题。
例:
CImage m_pCurrentFrame;
CPoint m_DisplayPoints[3]; // 放着旋转后的四边形的3个顶点 如果逆时针旋转90度
// m_DisplayPoints[0] 右上角,m_DisplayPoints[1] 左上角
// m_DisplayPoints[3] 右下角
int width,height; // 源图的宽和高
m_pCurrentFrame->PlgBlt(dc,m_DisplayPoints,0,0,width,height); // m_pCurrentFrame 转90度
CImage用了GdiPlus的,是不是差什么初始化操作?
每次都返回E_FAIL么,未知错误?
----
CImage是可以调试源码的,跟踪一下看看吧,是不是GDIPLUS初始化失败了。
CImage::Create()
CreateEx()这两个函数可以满足你的要求。
BOOL CreateEx(
int nWidth,
int nHeight,
int nBPP,
DWORD eCompression,
const DWORD pdwBitmasks = NULL,
DWORD dwFlags = 0
) throw( );
BOOL Create(
int nWidth,
int nHeight,
int nBPP,
DWORD dwFlags = 0
) throw( );
上面是这二个函数的原型,你在使用的时候把参数nBPP设置为1即是二值图像。
CImage是atl类。存在于比较新的VC版本中(vc6中无)。
以上就是关于CImage 直接内存操作全部的内容,包括:CImage 直接内存操作、vs2010中CBitmap静态图片控件只能显示出在资源中的位图,如何使用CImage类使控件支持jpg等其他格式图片、CImage图像旋转问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!