`
java-mans
  • 浏览: 11439299 次
文章分类
社区版块
存档分类
最新评论

24bit彩色图像转8bit灰度图

 
阅读更多

char szFileName[MAX_PATH] = "";
OPENFILENAME file={0};
file.lStructSize=sizeof(file);
file.lpstrFile=szFileName;
file.nMaxFile=MAX_PATH;
file.lpstrFilter="BMP Files(*.bmp)/0*.bmp/0JPG Files(*.jpg)/0*.jpg/0All Files/0*.*/0/0";
file.nFilterIndex=1;
if(::GetOpenFileName(&file)){
imgFile = new char[sizeof(szFileName) + 1];
strcpy(imgFile, szFileName);
//::MessageBox(NULL,imgFile,"TEST",MB_OK);
}

char* tmp = new char[255];
sprintf(tmp,"Open File: %s",imgFile);


if(imgFile == NULL || strlen(imgFile)<4){
AfxMessageBox("Image FileName Not Right.");
return;
}

//判断图像格式
USES_CONVERSION;
Bitmap bmp(A2W(imgFile));//加载BMP
int iPF= bmp.GetPixelFormat();

sprintf(tmp,"data.PixelFormat=%d", iPF);
AfxMessageBox(tmp);

if(iPF == PixelFormat8bppIndexed){
objCDib = new CDib();
objCDib->LoadFile(imgFile);

//view->RedrawWindow();
view->Invalidate();
}else if(iPF == PixelFormat24bppRGB){
// Specify a pixel format.
UINT w = bmp.GetWidth();
UINT h = bmp.GetHeight();

// Lock the bitmap's bits.
Rect rect(0, 0, w, h);

BitmapData data;
bmp.LockBits(&rect, ImageLockModeRead, PixelFormat24bppRGB, &data);
unsigned char *pData = static_cast<unsigned char*>(data.Scan0);


int w0 = w;
if(w % 4 !=0){
//w0 += 4-w%4; //这里不需要对齐
}

int bitwidth = w*3;
if(w*3 % 4 !=0){
bitwidth += 4-w*3%4;//原数据已对齐
}

sprintf(tmp,"w=%d,w0=%d,bitwidth=%d",w,w0,bitwidth);
AfxMessageBox(tmp);

BYTE* NewImg = new BYTE[w0*h];
memset(NewImg,0,w0*h);

for(int i=h-1;i>=0;i--) {
//memcpy(NewImg+i*ByteWidth,img+i*width*3,width*3);
for(int j=0;j<w;j++){
UINT R = *(pData+i*bitwidth + j*3);
UINT G = *(pData+i*bitwidth + j*3 +1);
UINT B = *(pData+i*bitwidth + j*3 +2);
UINT Y = 0.299*R+0.587*G+0.114*B;
NewImg[i*w0+j] = R;
}
}

//释放位图资源
bmp.UnlockBits(&data);

注:对24bit位图,一个像素使用3个字节存储。对齐是指行的总字节数对齐,即bitmapWidth*3 % 4必须为0,而不是bitmapWidth%4等于0。

对齐方法:

int bitwidth = w*3;
if(w*3 % 4 !=0){
bitwidth += 4-w*3%4;//原数据已对齐
}

分享到:
评论

相关推荐

    24bitsBMP真彩图片转成8bitsBMP灰度图像

    将一个标准24bit真彩色BMP文件中三基色图像提取出来存成独立的8bit灰度图像(BMP)

    bmp 真彩色转灰度

    BMP图像文件的操作,编写C++程序,可以将一个标准24bit真彩色BMP文件中三基色图像提取出来存成独立的8bit灰度图像(BMP)

    图像增强的实现

    功能:显示图像的等灰度值图 格式:imcontour(I,n),imcontour(I,v) 说明:n 为灰度级的个数,v 是有用户指定所选的等灰度级向量。 1.3 imadjust 函数 功能:通过直方图变换调整对比度 格式:J=imadjust(I,[low high...

    基于图像的自动识别技术

    车牌预处理过程的好坏直接影响到车牌图像进行后期...输入的车牌是24Bit的BMP真彩色图像,车牌照有黄底黑字,蓝底白字等颜色,为了将这些车牌图像一并处理,就要先将车牌进行灰度化处理,然后进行二值化(黑白)处理。

    基于哈夫曼编码的文件编解码系统的程序设计.wps

    把它数字化,每帧512x512象素,每象素的R、G、B三分量分别占8 bit,总比特数为90x60x24x3x512x512x8bit=97,200M。 例如3:一张CD光盘可存600兆字节数据,这部电影光图像(还有声音)就需要160张CD光盘用来存储。 ...

    实验1-参考代码.pdf

    FormatVersion (格式 版本)、Width (图像宽度)、Height (图像高度)、BitDepth (每个像 素的位深度)、ColorType (彩色类 型)、CodingMethod (编码方法)等。 (3) 利用“像素和统计处理”函数计算读入图像的二维...

    遥感影像序列生成视频

    遥感影像序列生成视频的程序,支持8bit灰度图像和彩色图像以及16位灰度图像和彩色图像 必要的库: opencv2.4.9及以上版本 gdal110及以上版本 boost1.59及以上版本 原理可以参考: ...

    C语言、matlab车牌识别

    C语言,matlab车牌识别代码及原理。...输入的车牌是24Bit的BMP真彩色图像,车牌照有黄底黑字,蓝底白字等颜色,为了将这些车牌图像一并处理,就要先将车牌进行灰度化处理,然后进行二值化(黑白)处理。

    信息技术常用公式.doc

    信息技术常用公式 1. 声音存储空间的计算公式是: 音频存储容量=采样频率..."256级灰度 "800×600 "8位(2^8=256)"800×600×8 "800×600×8/8 " "16色彩色 "800×600 "4位(2^4=16) "800×600×4 "800×600×4/8 " "2

    DCTJPEG.zip_DCHuffmanEncoding_JPEG编解码_denoised image_image inter

    使用Matlab编程实现发送端信源编码(图像压缩)和接收端信源解码(图像重建),其中的编解码算法可采用基于DCT变换的JPEG图像...可将8bit/pixel灰度图像扩展至24bit/pixel彩色图像,或者采用无损压缩算法对图像压缩。

    简单的水印嵌入系统:简单易用的应用程序,用于嵌入和提取图像中的隐藏数据。-matlab开发

    简单易用的嵌入应用程序并提取图像中的隐藏数据。... 由于操作色度分量,仅支持彩色图像(例如没有灰度图像或纯白色) 4. 支持的输入图像格式为 JPG 和 BMP。 输出图像以 BMP 格式生成。 也仅在当前工作目录中!

    超强的图像处理类CDib

    //将图像转换成256色灰度图,pOrigDib为待转换的图像,缺省则转换自身 void SetTo256Gray(); bool ChangeToBW(CDib* pOrigDib = NULL, int byCritical = 128); //二值化,BW: black & white, byCritical为阈值...

    多媒体技术测试图片集

    用于测试自己所编写的图像处理算法,囊括各种类型的灰度图,彩色图,8-bit图片等等

    随机LSB匹配算法,随机选择算法,matlab

    使用MATLAB编写一个可以对8bit灰度和24bit真彩色BMP图像,进行随机LSB匹配算法嵌入秘密信息的程序,可设定随机密钥,可选择文件嵌入,有GUI,有代码注释。

    Cyberbit:Python中的视觉密码学和位平面复杂度分割-开源

    在您的照片中隐藏秘密消息!... 血管图像可以是8位灰度图像或24位深真彩色图像。 任何可以正确发现这两个容器并知道包含机密消息的图像尺寸的人,都可以使用Cyber​​bit应用程序对机密消息进行解密。

    离散数学实践任务2—集合与关系之函数综合应用

    对于一张24位真彩色数字图像,每个像素点由R、G和B通道组成,像素每个通道占8bit空间(1个Byte,取值0~255),其中R\G\B通道模型可表示为公式(1)的二维矩阵形式,假设24位真彩色数字图像大小像素,则每个含、、三个...

    LCD image Converter 2.1老朽痴拙汉化版(位图生成器qt)

    LCD image Converter 2.1.21102老朽痴拙汉化版(位图生成器qt) ...8, 16, 24, 32-bit data; 1...24 bits per pixel; RLE compression; With different display controllers, not limited by one particular model.

    Android加载大图片内存溢出

    bitmap颜色位数是24位在RGB模式下,一个像素对应的是红、绿、蓝三个字节  CMYK模式,bitmap颜色位数是32位在CMYK模式下,一个像素对应的是青、品、黄、黑四个字节  图像文件的字节数(Byte)=图像分辨率*颜色深度/8...

    针对LSB的RS隐写分析研究及改进

    介绍了基于数字图像的信息隐藏技术的...在不同的掩码和嵌入率下进行了大量实验,实验结果验证了该改进算法的有效性,基于该改进算法编写了检测程序,实现了对灰度及彩色图像的LSB(Least Significant Bit)隐藏检测。

Global site tag (gtag.js) - Google Analytics