计算机图像处理代码的学习

本文介绍了如何通过计算机图像处理技术,实现从灰度图片到彩色图片的转换,并详细讲解了使用HXLBMPFILE类处理BMP文件的加载、保存和数据操作过程。通过实例代码展示了如何使用这个类进行图片格式的转换和文件操作。
摘要由CSDN通过智能技术生成

通过最近学习的计算机图像处理的课程,我了解了图片具有灰度和彩色的区别,并且学习了通过具体的代码文件将一些图片数据进行存储和转化。
具体的代码如下:

第一部分:头文件
hxlbmpfile.h
#include"stdio.h"
#include"windows.h"
#ifndef HXLBMPFILEH
#define HXLBMPFILEH
class HXLBMPFILE {
BYTE * pImageData;
BOOL IsBMPFile(FILE* f);
int GetBytes1Line();
BOOL GetPara(FILE* f);
BOOL Get8BMPData(FILE* f);
BOOL Get24BMPData(FILE* f);
void SaveFileHeader(FILE* f);
void SaveInfoHeader(FILE* f);
BOOL Save8BMPData(FILE* f);
BOOL Save24BMPData(FILE* f);
public:
int iImagew,iImageh;
int iYRGBnum;//1:灰度,3:彩色
RGBQUAD rgbPalette[256];
BYTEpDataAt(int h,int Y0R0G1B2=0);
BOOL IspImageDataOk();
BOOL LoadBMPFile(char
fname);
BOOL SaveBMPFile(char*fname);
HXLBMPFILE();
~HXLBMPFILE();
};//提供函数框架,设置高度和宽度的数值

第二部分:
hxlbmpfile.cpp
#include"hxlbmpfile.h"
HXLBMPFILE::HXLBMPFILE() {
pImageData = NULL;
for (int i = 0; i < 256; i++) {
rgbPalette[i].rgbBlue =
rgbPalette[i].rgbGreen =
rgbPalette[i].rgbRed = i;
rgbPalette[i].rgbReserved = 0;
}
iYRGBnum = 0;
iImagew = iImageh = 0;
}
HXLBMPFILE::~HXLBMPFILE() {
if (pImageData)
delete[] pImageData;
}
BOOL HXLBMPFILE::IsBMPFile(FILE* f) {
fseek(f, 0, SEEK_END);
int flen = ftell(f);
BITMAPFILEHEADER fh;
fseek(f, 0, SEEK_SET);
fread(&fh, sizeof(BITMAPFILEHEADER), 1, f);
if (fh.bfType != 0x4d42) {//”BM”
fclose(f);
return false;
} if (fh.bfSize != flen) {
fclose(f);
return false;
}
return true;
}
BOOL HXLBMPFILE::IspImageDataOk() {
int size = iImagew * iImageh * iYRGBnum;
if (pImageData) {
delete[] pImageData;
pImageData = NULL;
}
pImageData = new BYTE[size];
if (pImageData) memset(pImageData, 0, size);
return pImageData != NULL;
}
int HXLBMPFILE::GetBytes1Line() {
return (iImagew * iYRGBnum + 3) / 4 * 4;
}
BOOL HXLBMPFILE::GetPara(FILE* f) {
BITMAPINFOHEADER ih;
fread(&ih, sizeof(BITMAPINFOHEADER), 1, f);
if (ih.biBitCount != 8) { //只调用8位和24位
if (ih.biBitCount != 24){
fclose(f);
return FALSE;
}
}
iYRGBnum = ih.biBitCount / 8;//1
iImagew = ih.biWidth;
iImageh = ih.biHeight;
fseek(f, 14 + ih.biSize, SEEK_SET);
if (iYRGBnum == 1)
fread(rgbPalette, sizeof(RGBQUAD), 256, f);
return TRUE;
}
BYTE* HXLBMPFILE::pDataAt(int h, int Y0R0G1B2) {
int iRGB = Y0R0G1B2 * iImagew;
if (iYRGBnum <= Y0R0G1B2) iRGB = 0;
return pImageData + h * iImagew + iRGB;
}BOOL HXLBMPFILE::Get8BMPData(FILE* f) {
int w4b = GetBytes1Line();
BYTE* ptr = NULL;
ptr = new BYTE[w4b];
if (!ptr) return FALSE;
for (int i = iImageh - 1; i >= 0; i–) {
fread(ptr, w4b, 1, f);
memmove(pDataAt(i), ptr, iImagew);
}
delete[] ptr;
return TRUE;
}
BOOL HXLBMPFILE::Get24BMPData(FILE* f) {
int w4b = GetBytes1Line();
BYTE* ptr = NULL;
ptr = new BYTE[w4b];
if (!ptr) return FALSE;
for (int i = iImageh - 1; i >= 0; i–) {
fread(ptr, w4b, 1, f);
for (int j = 0; j < iImagew; j++) {
(pDataAt(i, 0) + j) = (ptr + j * 3 + 2);
(pDataAt(i, 1) + j) = (ptr + j * 3 + 1);
(pDataAt(i, 2) + j) = (ptr + j * 3 + 0);
}
}
delete[] ptr;
return TRUE;
}
BOOL HXLBMPFILE::LoadBMPFile(char
cFname) {
if (strlen(cFname) < 5) return FALSE;
FILE
f = NULL;
f = fopen(cFname, “r+b”);
if (f == NULL) return FALSE;
if (!IsBMPFile(f)) return FALSE;
if (!GetPara(f)) {
fclose(f);
return FALSE;
}
if (!IspImageDataOk()) {
fclose(f);
return FALSE;
}
BOOL res = FALSE;
if (iYRGBnum == 1)
res = Get8BMPData(f);
else if (iYRGBnum == 3)
res = Get24BMPData(f);
fclose(f);
return res;
}
void HXLBMPFILE::SaveFileHeader(FILE
f) {
BITMAPFILEHEADER fh;
memset(&fh, 0, sizeof(BITMAPFILEHEADER));
fh.bfType = 0x4d42;
fh.bfOffBits = 14 + 40 +
((iYRGBnum == 1) ? 256 * sizeof(RGBQUAD) : 0);
fh.bfSize = fh.bfOffBits + iImageh * GetBytes1Line();
fwrite(&fh, sizeof(BITMAPFILEHEADER), 1, f);
}
void HXLBMPFILE::SaveInfoHeader(FILE
f) {
BITMAPINFOHEADER ih;
memset(&ih, 0, sizeof(BITMAPINFOHEADER));
ih.biSize = 40; ih.biPlanes = 1;
ih.biWidth = iImagew; ih.biHeight = iImageh;
ih.biBitCount = 8 * iYRGBnum;
ih.biSizeImage = iImageh * GetBytes1Line();
fwrite(&ih, sizeof(BITMAPINFOHEADER), 1, f);
if (iYRGBnum == 1)
fwrite(rgbPalette, sizeof(RGBQUAD), 256, f);
}
BOOL HXLBMPFILE::Save8BMPData(FILE
f) {
BITMAPINFOHEADER ih;
int w4b = GetBytes1Line();
BYTE
ptr = new BYTE[w4b];
if (ptr == NULL) return FALSE;
memset(ptr, 0, w4b);
for (int i = ih.biHeight - 1; i >= 0; i–) {
memmove(ptr, pDataAt(i), ih.biWidth);
fwrite(ptr, w4b, 1, f);
}
delete[] ptr;
return TRUE;
}
BOOL HXLBMPFILE::Save24BMPData(FILE* f) {
BITMAPINFOHEADER ih;
int w4b = GetBytes1Line();
BYTE* ptr = new BYTE[w4b];
if (ptr == NULL) return FALSE;
memset(ptr, 0, w4b);
for (int i = ih.biHeight - 1; i >= 0; i–) {
for (int j = 0; j < ih.biWidth; j++) {
*(ptr + j * 3 + 2) = *(pDataAt(i, 0) + j);
*(ptr + j * 3 + 1) = *(pDataAt(i, 1) + j);
(ptr + j * 3 + 0) = (pDataAt(i, 2) + j);
}
fwrite(ptr, w4b, 1, f);
}
delete[] ptr;
return TRUE;
}
BOOL HXLBMPFILE::SaveBMPFile(char
cFname) {
if (!pImageData) return FALSE;
if (strlen(cFname) < 5) return FALSE;
FILE
f = NULL;
f = fopen(cFname, “w+b”);
if (f == NULL) return FALSE;
SaveFileHeader(f);
SaveInfoHeader(f);
BOOL res = FALSE;
if (iYRGBnum == 1) res = Save8BMPData(f);
else if (iYRGBnum == 3) res = Save24BMPData(f);
fclose(f);
return res;
}//将图片信息导入到文件里(注意导入的图像数据与实际图像数据顺序相反;还有调整图片的灰度与彩色问题)

第三部分:main部分

#include “hxlbmpfile.h”

void ImageProcessing(HXLBMPFILE* bmp) {
int i = 0, j = 0;
HXLBMPFILE bf;
bf.iImagew = bmp->iImagew;
bf.iImageh = bmp->iImageh;
bf.iYRGBnum = bmp->iYRGBnum;
if (!bf.IspImageDataOk()) return;
for (i = 0; i < bf.iImageh; i++)
for (j = 0; j < bf.iImagew; j++) {
bf.pDataAt(i)[j] = 255 - bmp->pDataAt(i)[j];
}
bf.SaveBMPFile(“2.bmp”);
}

int main(int argc, char* argv[]) {
HXLBMPFILE bmpfile;
if (!bmpfile.LoadBMPFile(“C:\Users\lenovo\Downloads\b8color.bmp”)) {
printf(“Load BMP file failed.”);
return 1;
}
// do other processing with the imagedata//
ImageProcessing(&bmpfile);

printf("program ends!\n");
return 0;

}

函数主体可以不发生改变,只需要改变函数的具体部分就可以进行灰度图片与彩色图片之间的转化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值