用C或C++怎样提取出bmp图像的像素点信息值?用LSB算法做信息隐藏,位图是24位的。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C或C++怎样提取出bmp图像的像素点信息值?用LSB算法做信息隐藏,位图是24位的。相关的知识,希望对你有一定的参考价值。

希望能把程序贴出来,毕业设计用的,大侠帮帮忙

CImage m_image;//m_image就是要处理的图像
int bit=m_Image.GetBPP();//获取每点像素的位数(8,24,32等),如果只处理24位图,则bit可直接赋值为24
int width=m_Image.GetWidth();//图像的宽度(单位为像素)
int height=m_Image.GetHeight();//图像的长度(单位为像素)
HBITMAP bitmap = m_Image.Detach();//
CBitmap *b_Image=CBitmap::FromHandle(bitmap);//获取CBitmap类的实例
DWORD totalbytes=width*height*bit/8;//要保存像素数据需要的总的字节数,24位图的话,每个像素需要3个字节
byte *lpBits=new byte[totalbytes];//字节型数组,每个单位存一个字节的数据
int bytes=b_Image->GetBitmapBits(totalbytes,lpBits);//把像素数据存到数组lpBits里,通过看bytes是否为0可以知道是否成功,为0则没有成功
//接下来遍历数组即可获取像素数据,因为24位图是3个字节构成一个像素,所以遍历时要注意间隔。
参考技术A LSB算法不知道是什么,但我这有提取bmp像素值的源码,自己写的,如果需要邮箱联系,luoshibin@visiontops.com

已有一个bmp图片用标准c获取其任意点(给定坐标)像素信息?

要用标准c来写,对不起了各位兄弟。

/*
你还是听听高先生的建议吧,
前面我给你的回答除了使用了c++的‘
//’注释以外,使用纯C语言编写的。
你如果仅仅是想完你说的目的,
虽然一小段代码可以就完成但是却不太容易读懂 。
图像右下角坐标为(0,0)
*/

#include<stdio.h>
int main()

int width,height,x,y;
unsigned short bitCount;
int offbits;
int bitPerLine;
unsigned char data;
FILE* bmpfp = fopen("E:\\风景\\风景1.bmp","rb");
fseek(bmpfp,18,SEEK_SET);
fread(&width,sizeof(int),1,bmpfp);
fread(&height,sizeof(int),1,bmpfp);
printf("width : %d , height : %d\n",width,height);
fseek(bmpfp,2,SEEK_CUR);
fread(&bitCount,sizeof(bitCount),1,bmpfp);
fseek(bmpfp,10,SEEK_SET);
fread(&offbits,sizeof(int),1,bmpfp);

if(bitCount==24)
bitPerLine = ( (width*3)%4==0 ) ? width*3 : ( (width*3)/4 )*4 + 4;
while(1)
printf("请输出坐标:");
scanf("%d%d",&x,&y);
if(x>width||y>height) return 0;
fseek(bmpfp, 18 + offbits + bitPerLine * y + 3*x , SEEK_SET);
fread(&data,sizeof(data),1,bmpfp);
printf("该点蓝色分量:%d",data);
fread(&data,sizeof(data),1,bmpfp);
printf("该点绿色分量:%d",data);
fread(&data,sizeof(data),1,bmpfp);
printf("该点红色分量:%d\n",data);

else
printf("不是真彩位图!");



/*

运行结果:

width : 700 , height : 382
请输出坐标:0 0
该点蓝色分量:68该点绿色分量:82该点红色分量:80

*/
参考技术A 你是要获取其中任意点像素的颜色信息吗?
你可以用你的位图建立一个Bitmap对象,然后用其GetPixel函数即可,详情请参考...

Bitmap::GetPixel(x, y, color)
The GetPixel method gets the color of a specified pixel in this bitmap.

Status GetPixel(
INT x,
INT y,
Color* color
);
Parameters
x
[in] Integer that specifies the x-coordinate (column) of the pixel.
y
[in] Integer that specifies the y-coordinate (row) of the pixel.
color
[out] Pointer to a Color object that receives the color of the specified pixel.
Return Values
If the method succeeds, it returns Ok, which is an element of the Status enumeration.

If the method fails, it returns one of the other elements of the Status enumeration.

Remarks
Depending on the format of the bitmap, GetPixel might not return the same value as was set by SetPixel. For example, if you call SetPixel on a Bitmap object whose pixel format is 32bppPARGB, the pixel's RGB components are premultiplied. A subsequent call to GetPixel might return a different value because of rounding. Also, if you call SetPixel on a Bitmap object whose color depth is 16 bits per pixel, information could be lost during the conversion from 32 to 16 bits, and a subsequent call to GetPixel might return a different value.

Example Code [C++]
The following example creates a Bitmap object based on a JPEG file. The code calls the GetPixel method to obtain the color of a pixel in the bitmap and then fills a rectangle with the retrieved color.

VOID Example_GetPixel(HDC hdc)

Graphics graphics(hdc);

// Create a Bitmap object from a JPEG file.
Bitmap myBitmap(L"Climber.jpg");

// Get the value of a pixel from myBitmap.
Color pixelColor;
myBitmap.GetPixel(25, 25, &pixelColor);

// Fill a rectangle with the pixel color.
SolidBrush brush(pixelColor);
graphics.FillRectangle(&brush, Rect(0, 0, 100, 100));


Header: Declared in Gdiplusheaders.h; include Gdiplus.h.
参考技术B 楼主,还是先把bmp的格式,搞清楚吧

那样的话,你自己都可以写出这个功能的函数了啊。

补充:
楼上的回答,都是用c语言写的啊!
参考技术C msdn中看Device-Independent Bitmaps部分
既.bmp文件格式
参考技术D 24位?256位?16位?还是全都要?

以上是关于用C或C++怎样提取出bmp图像的像素点信息值?用LSB算法做信息隐藏,位图是24位的。的主要内容,如果未能解决你的问题,请参考以下文章

如何用c语言printf输出bmp图片的像素信息。

用c语言读取24位位图bmp文件

用C语言读取16位bmp图片的每个像素的信息~

用opencv如何提取像素点的RGB分量

求C++中利用opencv计算轮廓图像傅里叶描述子的代码

图像融合