一张24位BMP图片,读入一维数组后,如何把该图片反转180度呢? 现在已实现的功能:把BMP图片读入一维数组中,可以正常绘出正立的图;为了学习测试,想绘一个倒立图出来,想同时绘一个正立和倒立的图片出来。不重新读图片文件,想通过转换行列的算法,转成倒立的,不知道该如何实现??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //把BMP图片中的数据读入一维数组中unsigned char *pBmpBuffer; //bmp像素指针int BmpWidth; //宽int BmpHeight; //高RGBQUAD *ColorTable; //颜色表int BmpBit; //位数//加载bmp图片bool LoadBmp(char *BmpName) //从硬盘中读取BMP文件进内存{ FILE *fp=fopen(BmpName,"rb"); if(fp==0) return 0; fseek(fp,sizeof(BITMAPFILEHEADER),0); //跳过BITMAPFILEHEADER BITMAPINFOHEADER head; fread(&head,sizeof(BITMAPINFOHEADER),1,fp); //head结构体 BmpWidth=head.biWidth; //宽 BmpHeight=head.biHeight; //高 BmpBit=head.biBitCount; //位数 int LineByte=(BmpWidth*BmpBit/8+3)/4*4; //一行真实字节数 if(BmpBit==8) //如果是8位图 { ColorTable=new RGBQUAD[256]; //申请颜色表需要的空间,读颜色表进内存 fread(ColorTable,sizeof(RGBQUAD),256,fp); } pBmpBuffer= new unsigned char[LineByte*BmpHeight]; //申请空间 fread(pBmpBuffer,1,LineByte*BmpHeight,fp); //读像素数据进内存 fclose(fp); return 1;} 告诉你原理:原图f(x,y)新图g(x,y)g(x,y) = f(x,height-y);建议你先仔细研究研究bmp文件的结构,里面有你进行for循环所需的数据 如果你用Gdi+画的画,直接用g.RotateTransform(angle);载入图片使用CImage::FromFile("")画图用g.DrawImage()。如果你是把位图读入内存,使用StretchDIBits或者Bitblt或者stretchBlt的画,可以根据下面的原则:(1)将原图像读入缓冲区 (2) 计算图像的高度,即行数height;计算图像宽度width;根据宽度、高度生成新缓冲区; (3)把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。既原图中的(x、y)点,在新生成的图象中对应为x1=x,y1=height-1-y。把原图中的象素值读入新缓冲区的(x1,y1)点处。 (4)显示位图 需要一个for循环。至于程序代码看一楼的,写蛮清楚,再根据自己的需要改下,应该是这样的。 //把BMP图片中的数据读入一维数组中unsigned char *pBmpBuffer; //bmp像素指针int BmpWidth; //宽int BmpHeight; //高RGBQUAD *ColorTable; //颜色表int BmpBit; //位数//加载bmp图片bool LoadBmp(char *BmpName) //从硬盘中读取BMP文件进内存{ FILE *fp=fopen(BmpName,"rb"); if(fp==0) return 0; fseek(fp,sizeof(BITMAPFILEHEADER),0); //跳过BITMAPFILEHEADER BITMAPINFOHEADER head; fread(&head,sizeof(BITMAPINFOHEADER),1,fp); //head结构体 BmpWidth=head.biWidth; //宽 BmpHeight=head.biHeight; //高 BmpBit=head.biBitCount; //位数 int LineByte=(BmpWidth*BmpBit/8+3)/4*4; //一行真实字节数 if(BmpBit==8) //如果是8位图 { ColorTable=new RGBQUAD[256]; //申请颜色表需要的空间,读颜色表进内存 fread(ColorTable,sizeof(RGBQUAD),256,fp); } pBmpBuffer= new unsigned char[LineByte*BmpHeight]; //申请空间 /* fread(pBmpBuffer,1,LineByte*BmpHeight,fp); //读像素数据进内存 */ //如果你要将图片倒立的话,你可以这样读,看代码 unsigned char *temp=pBmpBuffer+LineByte*BmpHeight; do { temp-=LineByte; fread(temp,1,LineByte,fp); }while(temp>=pBmpBuffer); //这样就把数据颠倒过来了呵呵 fclose(fp); return 1;} VC界面静态文本超链接设置 写ocx遇到困惑,请高人指点。 求教:为什么说使用非阻塞套接字 比使用 阻塞套接字 性能要好 效率要高啊。高分 求理论的解释 请问mfc中如何实现 propertyGrid? 正在学习SDK编程,问题多多,想找个老师解惑!!! 怎样自定义消息? AVI播放问题 如何看一个服务器是真正的服务器还是虚拟主机呢?(无内容) 新学VC又不懂的啦请教 创建兼容DC失败 WriteFile被卡了,求解 360和金山卫士界面上的那几个“按钮”是怎么做出来的?
int BmpWidth; //宽
int BmpHeight; //高
RGBQUAD *ColorTable; //颜色表
int BmpBit; //位数//加载bmp图片
bool LoadBmp(char *BmpName) //从硬盘中读取BMP文件进内存
{
FILE *fp=fopen(BmpName,"rb");
if(fp==0)
return 0;
fseek(fp,sizeof(BITMAPFILEHEADER),0); //跳过BITMAPFILEHEADER
BITMAPINFOHEADER head;
fread(&head,sizeof(BITMAPINFOHEADER),1,fp); //head结构体
BmpWidth=head.biWidth; //宽
BmpHeight=head.biHeight; //高
BmpBit=head.biBitCount; //位数
int LineByte=(BmpWidth*BmpBit/8+3)/4*4; //一行真实字节数
if(BmpBit==8) //如果是8位图
{
ColorTable=new RGBQUAD[256]; //申请颜色表需要的空间,读颜色表进内存
fread(ColorTable,sizeof(RGBQUAD),256,fp);
}
pBmpBuffer= new unsigned char[LineByte*BmpHeight]; //申请空间
fread(pBmpBuffer,1,LineByte*BmpHeight,fp); //读像素数据进内存
fclose(fp); return 1;
}
原图f(x,y)
新图g(x,y)
g(x,y) = f(x,height-y);
建议你先仔细研究研究bmp文件的结构,里面有你进行for循环所需的数据
画图用g.DrawImage()。
如果你是把位图读入内存,使用StretchDIBits或者Bitblt或者stretchBlt的画,可以根据下面的原则:
(1)将原图像读入缓冲区 (2) 计算图像的高度,即行数height;计算图像宽度width;根据宽度、高度生成新缓冲区; (3)把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。既原图中的(x、y)点,在新生成的图象中对应为x1=x,y1=height-1-y。把原图中的象素值读入新缓冲区的(x1,y1)点处。 (4)显示位图
int BmpWidth; //宽
int BmpHeight; //高
RGBQUAD *ColorTable; //颜色表
int BmpBit; //位数//加载bmp图片
bool LoadBmp(char *BmpName) //从硬盘中读取BMP文件进内存
{
FILE *fp=fopen(BmpName,"rb");
if(fp==0)
return 0;
fseek(fp,sizeof(BITMAPFILEHEADER),0); //跳过BITMAPFILEHEADER
BITMAPINFOHEADER head;
fread(&head,sizeof(BITMAPINFOHEADER),1,fp); //head结构体
BmpWidth=head.biWidth; //宽
BmpHeight=head.biHeight; //高
BmpBit=head.biBitCount; //位数
int LineByte=(BmpWidth*BmpBit/8+3)/4*4; //一行真实字节数
if(BmpBit==8) //如果是8位图
{
ColorTable=new RGBQUAD[256]; //申请颜色表需要的空间,读颜色表进内存
fread(ColorTable,sizeof(RGBQUAD),256,fp);
}
pBmpBuffer= new unsigned char[LineByte*BmpHeight]; //申请空间
/*
fread(pBmpBuffer,1,LineByte*BmpHeight,fp); //读像素数据进内存
*/
//如果你要将图片倒立的话,你可以这样读,看代码
unsigned char *temp=pBmpBuffer+LineByte*BmpHeight;
do
{
temp-=LineByte;
fread(temp,1,LineByte,fp);
}while(temp>=pBmpBuffer);
//这样就把数据颠倒过来了呵呵
fclose(fp); return 1;
}