这里需要GetBits()函数获得每一行图像数据的首像素的指针,不得不再次提醒的是,图像数据是从下到上,从左到右的方式扫描的。然后用GetEffWidth()函数获得图像的每行的stride长度,用来申请内存空间,注意:对于32位RGBA图像的储存方式,这个函数只是获得的RGB内存块的宽度,下面会详细介绍。同样的除了GetBits()这个函数可以获得图像数据指针之外,还有GetDIB()函数来直接获得图像数据指针。注意:图像数据指针指向左下角像素位置,所以图像数据是上下颠倒的。
首先
首先创建CxImage类对象读取图像,判断为真进入循环。
CxImage image;
image.Load(strFilePath,0);
if (image.IsValid())
{
int width = image.GetWidth();
int height = image.GetHeight();//获得宽高基本尺寸
int ColorType = image.GetColorType();//1 = indexed, 2 = RGB, 4 = RGBA, 获得颜色模型
int BytePerLine = image.GetEffWidth();
//(bitCount*width + 3)/ 4* 4;//4字节对齐
//int BytePerLine =((((image.GetBpp() * width) + 31) / 32) * 4);
/*两个宽度,一个是图像的宽度,例如201。另一个宽度是你的数据矩阵的宽 度,BytePerLine。这个值根据你的图像而定,如果你的图像是24位真彩, 201*3=603,这个数据不能被4整除,必须强制其等于604,这样你的数据矩阵 就是604*height。显示时的宽度还是你的201不变*/
BYTE* pDib = image.GetBits();
BYTE* buffer = new BYTE[height*BytePerLine];
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
buffer[j*BytePerLine+i*3] = *(pDib+(height-1- j)
*BytePerLine + i*3);
buffer[j*BytePerLine+i*3+1] = *(pDib+(height-1-j)
*BytePerLine + i*3+1);
buffer[j*BytePerLine+i*3+2] = *(pDib+(height-1-j)
*BytePerLine + i*3+2);
}
}
delete[] buffer;
}
或者直接用GetDIB()函数。
CxImage image;
image.Load(strFilePath,0);
if (image.IsValid())
{
int width = image.GetWidth();
int height = image.GetHeight();
int ColorType = image.GetColorType();
int BytePerLine = image.GetEffWidth();
BYTE* pDib = image.GetDIB();
BYTE* buffer = new BYTE[height*BytePerLine];
memset(buffer,0,height*BytePerLine);
memcpy(buffer,pdib,height*BytePerLine);
//特别注意:这里图像是倒像咬
}
delete[] buffer;
}