弄了一天了,还是不对!跪求帮助!关于对24位bmp位图像素数据数组的问题! 本帖最后由 xyczy 于 2012-09-24 13:11:59 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ((((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4)公式计算的是图像中每行像素所占的字节数;有一点要注意的是BMP图像要求每行数据4字节对齐,所以才会有上面这个公式再乘以图像高度得到图像数据所占内存大小。 这个我知道啊,我就是问公式怎么来的还有高度的字节数应该是biheight*3吧,24位的图哦 int width=(((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4;width 里就包含 *3;即 biBitCount 你这个程序打开的是一个位图,就是后缀名为.bmp的图片.如果用于打开jpg图片当然不可能成功了,你看一下文件头里的bfType的值就知道了.想试程序就截一幅位图吧,少年!!! 3楼:stBMPInfoHeader.biWidth不是表示像素值吗我图片是600*400的,那这个值是600*3吗?4楼:当然是bmp图而且我已经把效果图链接放在末尾了,而且能正常显示的,只是我想显示之前对像素进行一些操作不知道这个像素坐标对应的数组下标该怎么算 biWidth当然是600,这个仅表示每行有多少个像素点,和你图像是否为彩色、还是灰度没关系。我觉得你现在的问题是,没有弄清:每行的像素点数和每行像素所占字节数这两个概念;//每行图像所占字节数,4字节对齐int nLineBytes = (((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4;//图像宽int nWidth = stBMPInfoHeader.biWidth;//图像高int nHeight= stBMPInfoHeader.biHeight;//for(int i = 0; i < nHeight; i++){ for(int j = 0; j < nWidth; j++) { if(i>=0 && i<=100 && j>=0 && j<=100) { //这里注意是行下标乘每行数据所占字节数 pByte[nLineBytes*i + j*3+2] -= 20; //r pByte[nLineBytes*i + j*3+1] -= 20; //g pByte[nLineBytes*i + j*3] -= 20; //b } }}// 厉害!真的对了,我再理清一下这个关系。只是修改后的显示在左下角,是因为bmp数据是从左下角开始显示的原因吗?分先给你了 pByte[nLineBytes*(height-i-1)+j*3+2]-=20; pByte[nLineBytes*(height-i-1)+j*3+1]-=20; pByte[nLineBytes*(height-i-1)+j*3]-=20;bingo!对图片格式又加深了感谢laoma_hbu! 求教基础问题,请问大家点击计算机右下角的 时间和日期设置 里面的时分秒显示是如何实现的呢? 怎么保存图片 关于路由器登陆须输入用户名密码的问题 在CFileDialog类中如何设置,才能使文件列表中只显示即插即用设备? 陌生人。v2 关于CIPAddressCtrl类的问题 [100求教诸位] 如何在单文档切分视图中运用OpenGL? 金山游侠原理 是否可以用socket发送结构体 关于Socket的问题,请多帮助! 求助,这个this指针让我崩溃 VC重命名一个类后,不显示。
有一点要注意的是BMP图像要求每行数据4字节对齐,所以才会有上面这个公式再乘以图像高度得到图像数据所占内存大小。
width 里就包含 *3;即 biBitCount
4楼:当然是bmp图而且我已经把效果图链接放在末尾了,而且能正常显示的,只是我想显示之前对像素进行一些操作不知道这个像素坐标对应的数组下标该怎么算
我觉得你现在的问题是,没有弄清:每行的像素点数和每行像素所占字节数这两个概念;//每行图像所占字节数,4字节对齐
int nLineBytes = (((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4;
//图像宽
int nWidth = stBMPInfoHeader.biWidth;
//图像高
int nHeight= stBMPInfoHeader.biHeight;//
for(int i = 0; i < nHeight; i++)
{
for(int j = 0; j < nWidth; j++)
{
if(i>=0 && i<=100 && j>=0 && j<=100)
{
//这里注意是行下标乘每行数据所占字节数 pByte[nLineBytes*i + j*3+2] -= 20; //r
pByte[nLineBytes*i + j*3+1] -= 20; //g
pByte[nLineBytes*i + j*3] -= 20; //b
}
}
}
//
pByte[nLineBytes*(height-i-1)+j*3+1]-=20;
pByte[nLineBytes*(height-i-1)+j*3]-=20;bingo!对图片格式又加深了感谢laoma_hbu!