用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文件

#include <windows.h>
//读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图片的数据并转化为灰度图保存到文件中的主要内容,如果未能解决你的问题,请参考以下文章

用vs2010编写C#程序,将图片保存到一个文件夹中,下次循环覆盖保存,提示gdi+中发生一般性错误。。。

c#如何识别一张图片的格式

微信小程序上传图片并转化为base64格式

6.3.3 读取BMP图片信息

R读取json文件并转化为dataframe

C# 扫描并读取图片中的文字