用c#编写一个程序读取一张bmp图片的数据并转化为灰度图保存到文件中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c#编写一个程序读取一张bmp图片的数据并转化为灰度图保存到文件中相关的知识,希望对你有一定的参考价值。
读取本地图片地址:Image img = Bitmap.FromFile("文件地址");
转换为 Bitmap 对象:
Bitmap bmpobj = (Bitmap)img;
转换为灰度图片(传入刚才转换为 Bitmap 的对象,返回值为转换后的灰度图片对象):
public Bitmap GrayByPixels(Bitmap bmpobj)
for (int i = 0; i < bmpobj.Height; i++)
for (int j = 0; j < bmpobj.Width; j++)
int tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i));
bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue));
return bmpobj;
这个是用来计算灰度值的私有方法:
private int GetGrayNumColor(System.Drawing.Color posClr)
return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16;
将返回的对象转换为 Image 对象:
Image img = (Image)bmpobj;
将 img 保存到硬盘:
img.Save("要保存路径与文件名"); 参考技术A 不太清楚
用C语言编写程序处理图片bmp文件 1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直
用C语言编写程序处理图片bmp文件
1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直分辨率
2.显示bmp文件
//读bmp图片需要两个结构
#pragma pack(push, enter_defBM, 1) //指定内存对齐单位为1。
typedef struct tagBmpFileHeader
WORD bfType; // 文件类型 BM
DWORD bfSize; // 文件大小
WORD bfReserved1; // 保留字
WORD bfReserved2; // 保留字
DWORD bfOffBits; // 位图的数据信息离文件头的偏移量
BFH;
typedef struct tagBmpImgHeader
DWORD biSize; // 表示本结构的大小,0X28
LONG biWidth; // 位图的宽度
LONG biHeight; // 位图的高度
WORD biPlanes; // 位面数永远为1
WORD biBitCount; // 位图的位数
DWORD biCompression; // 压缩类型
DWORD biSizeImage; // 表示位图数据区域的大小
LONG biXPelsPerMeter; // 表示显示设备的水平分辨率
LONG biYPelsPerMeter; // 表示显示设备的垂直分辨率
DWORD biClrUsed; // 实际使用的颜色数目
DWORD biClrImportant; // 重要的颜色数量
BIH;
#pragma pack(pop, enter_defBM) //恢复默认内存对齐单位。
#define HDIB HANDLE // 位图句柄
DWORD WINAPI DIBNumColors(BYTE * data)
WORD wBitCount;
DWORD dwClrUsed = ((BIH *)data)->biClrUsed;
if (dwClrUsed != 0) return (WORD)dwClrUsed;
wBitCount = ((BIH *)data)->biBitCount;
return 1 << wBitCount;
WORD WINAPI PaletteSize(BYTE * data)
return (WORD)(::DIBNumColors(data) * sizeof(RGBQUAD));
BYTE * WINAPI FindDIBBits(BYTE * data)
return (data + *(DWORD *)data + ::PaletteSize(data));
// 获取Bmp的宽度
DWORD FAR DIBWidth(const BYTE * data)
BIH * pbmi;
pbmi = (BIH *)data;
if(pbmi->biSize == sizeof(BIH)) return pbmi->biWidth;
else return -1;
// 获取Bmp的高度
DWORD FAR DIBHeight(const BYTE * data)
BIH * pbmi;
pbmi = (BIH *)data;
if(pbmi->biSize == sizeof(BIH)) return pbmi->biHeight;
else return -1;
// 从文件读取Bmp图像数据
HDIB WINAPI ReadDIBFile(FILE * fp)
BFH bmf;
HDIB hDIB;
BYTE * pData;
rewind(fp);
if(fread(&bmf, sizeof(BFH), 1, fp) != 1) return NULL; // 文件读取错误
if(bmf.bfType != 19778) return NULL; // 文件类型错误
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, bmf.bfSize); // 为DIB分配内存
if (hDIB == 0) return NULL; // 内存分配失败。
pData = (BYTE *)::GlobalLock((HGLOBAL) hDIB); // 锁定
if(fread(pData, 1, bmf.bfSize - sizeof(BFH), fp) != (bmf.bfSize - sizeof(BFH))) // 文件读取错误
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
::GlobalFree((HGLOBAL) hDIB); // 释放内存
return NULL;
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
return hDIB; // 返回DIB句柄
BOOL WINAPI PaintDIB(HDC hDC, int posX, int posY, HDIB hDIB)
BYTE * pDIBHd; // BITMAPINFOHEADER指针
BYTE * pDIBBits; // DIB象素指针
BOOL bSuccess = FALSE; // 成功标志
HPALETTE hPal = NULL; // DIB调色板
//HPALETTE hOldPal = NULL; // 以前的调色板
if (hDIB == NULL) return FALSE; // 判断DIB对象是否为空
pDIBHd = (BYTE *) ::GlobalLock((HGLOBAL) hDIB); // 锁定DIB
pDIBBits = ::FindDIBBits(pDIBHd); // 找到DIB图像象素起始位置
::SetStretchBltMode(hDC, COLORONCOLOR); // 设置显示模式
// 调用SetDIBitsToDevice()来绘制DIB对象
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
posX, posY,
((BIH *)pDIBHd)->biWidth, // nDestWidth
((BIH *)pDIBHd)->biHeight, // nDestHeight
0, // SrcX
0, // SrcY
0, // nStartScan
(WORD)DIBHeight(pDIBHd), // nNumScans
pDIBBits, // lpBits
(LPBITMAPINFO)pDIBHd, // lpBitsInfo
DIB_RGB_COLORS); // wUsage
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
return bSuccess;
// 打印位图信息
VOID WINAPI PrintDIBInfo(HDIB hDIB)
BYTE * pDIBHd = (BYTE *)::GlobalLock((HGLOBAL) hDIB);
BIH * pbmi = (BIH *)pDIBHd;
const char *lp[] =
"位图信息长度: %d\\n",
"位图图像大小: %dx%d\\n",
"位面数:%d\\n",
"位图颜色深度: %d\\n",
"位图数据压缩类型: %d\\n",
"位图数据区域大小: %d\\n",
"位图分辨率: 水平 %d dpi, 垂直 %d dpi\\n",
;
printf("Windows V3 cBitmapInfoHeader 信息\\n\\n");
printf(lp[0], pbmi->biSize);
printf(lp[1], pbmi->biWidth, pbmi->biHeight);
printf(lp[2], pbmi->biPlanes);
printf(lp[3], pbmi->biBitCount);
printf(lp[4], pbmi->biCompression);
printf(lp[5], pbmi->biSizeImage);
printf(lp[6], (LONG)(pbmi->biXPelsPerMeter * 0.0254f + 0.5f), (LONG)(pbmi->biYPelsPerMeter * 0.0254f + 0.5f));
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
int main(int argc, char* argv[])
HDIB x;
FILE * fp = fopen("1.bmp", "rb");
if(fp==NULL) return -1;
x = ReadDIBFile(fp);
printf("DIB handle %u", x);
PaintDIB(GetDC(NULL), 0, 0, x);
PrintDIBInfo(x);
return 0;
追问
这个可以在vc6.0里边运行吧????
谢谢你啊!
追答Windows下编译器应该都能运行,代码是参考MFC里处理bmp图相关函数编写
追问哦哦,谢谢你啊!
参考技术A 树大分叉vgbhjbbjn追问说的是什么东东啊?????
参考技术B 这个以前老师讲过 我还留了一份 发邮箱我给你发一份追问谢谢你啊
在吗?
参考技术C 关注次问题以上是关于用c#编写一个程序读取一张bmp图片的数据并转化为灰度图保存到文件中的主要内容,如果未能解决你的问题,请参考以下文章