#include "imagefile.h"
#include <Windows.h>
#include <string.h>
#include <QString>
#include <QFile>
void CreateBmpFileHeader(char *filename,long width,long height,WORD bitCount)
{
FILE *out;
bITMAPFILETYPE bft2;
bITMAPFILEHEADER bfh2;
bITMAPINFOHEADER bih2;
DWORD LineByte,ImgSize;
//分配内存空间把源图存入内存
LineByte = WIDTHBYTES(width*bitCount);//计算位图一行的实际宽度并确保它为32的倍数
ImgSize=height*LineByte;
if (bitCount==24||bitCount==8)
{
if (bitCount==24)
{
bfh2.bfSize=(DWORD)(54+ImgSize);
bfh2.bfOffBits=(DWORD)(54); //文件头距离像素数据的偏移量
}
if (bitCount==8)
{
bfh2.bfSize=(DWORD)(54+256+ImgSize);
bfh.bfOffBits=(DWORD)(54+4*256);//文件头距离像素数据的偏移量
}
//-----------------------write bmp fileheader's info---------------------
//bmp file's type
bft2.bfType=0x4D42;
//bmp fileheader's info
bfh2.bfReserved1=0;
bfh2.bfReserved2=0;
//bmp file's infoheader
bih2.biSize=40;//本位图信息头的长度,为40字节
bih2.biWidth=width;
bih2.biHeight=height;
bih2.biPlanes=1;
bih2.biBitCount=bitCount;//位图颜色位深
bih2.biCompression=0;//是否压缩:0不压缩
bih2.biSizeImage=ImgSize;//像素数据大小;
bih2.biXPelsPerMeter = 0;
bih2.biYPelsPerMeter = 0;
bih2.biClrUsed = 0;//用到的颜色数,为0则是 2^颜色位深
bih2.biClrImportant = 0;//重要的颜色数,为0则全部都重要
//---------------------------Output----------------------------
out = fopen(filename,"wb");
if(out)
{
//write bmp file's type
fwrite(&bft2,sizeof(bITMAPFILETYPE),1,out);
//write bmp file's header info
fwrite(&bfh2,sizeof(bITMAPFILEHEADER),1,out);
//write bmp file's infoheader
fwrite(&bih2,sizeof(bITMAPINFOHEADER),1,out);
if (bitCount==8)
{
//write bmp file's rgbquad
fwrite(rgb,sizeof(rGBQUAD),sizeof(rgb)/sizeof(rGBQUAD),out);
}
fclose(out);
}
}
}
//创建bmp文件头
void CreateBmpFile(char *filename, BYTE *Imgdata_N, long width, long height)
{
remove(filename);//删除之前的备份图像
CreateBmpFileHeader(filename, width, height, bih.biBitCount);//写图像文件头部分
//-------------------------写图像文件图像数据部分----------------------------
FILE *out;
out = fopen(filename,"ab+");//追加写入(承接文件头)
if (out)
{
DWORD LineByte_N = WIDTHBYTES(width*bih.biBitCount);
DWORD ImgSize_N = height*LineByte_N;
fwrite(Imgdata_N,sizeof(BYTE),ImgSize_N,out);
fclose(out);
}
}
//创建bmp文件)
void AnalysisBmp(char *filename, long &width, long &Height, long &BitCount)
{
FILE *in;
if (width==0&&Height==0&&BitCount==0)
{
memset(Ogra,0,sizeof(Ogra));
memset(rgb,0,sizeof(rgb));
}
memset(Ngra,0,sizeof(Ngra));
in=fopen(filename,"rb");
if (in)
{
fread(&bft.bfType,sizeof(bITMAPFILETYPE),1,in);//读取文件类型信息
if (bft.bfType!=0x4d42)
{
//此文件不是BMP文件类型;
return;
}
else
{
fread(&bfh,sizeof(bITMAPFILEHEADER),1,in);//读取位图文件头信息
fread(&bih,sizeof(bITMAPINFOHEADER),1,in);//读取位图文件头信息
width=bih.biWidth; Height=bih.biHeight; BitCount=bih.biBitCount;//提取源图像的信息(传递于Dialog类中)
DWORD LineByte = WIDTHBYTES(width*BitCount);
if (bih.biBitCount==24)
{
Imgdata=(BYTE *)malloc(bih.biSizeImage);//分配图像数据存储内存
fread(Imgdata,bih.biSizeImage,1,in);//读取位图像素数据
//free(Imgdata);
for (long i=0;i<Height;i++)
{
for (long j=0;j<width;j++)
{
BYTE B_data=Imgdata[LineByte*i+3*j];
BYTE G_data=Imgdata[LineByte*i+3*j+1];
BYTE R_data=Imgdata[LineByte*i+3*j+2];
if (Ogra[256]==0) Ogra[((9798*R_data+19235*G_data+3735*B_data))/32768]++;
Ngra[((9798*R_data+19235*G_data+3735*B_data))/32768]++;
}
}
if (Ogra[256]==0)
{
OWidth=width;
OHeight=Height;
Ogra[256]=-1;
}
}
else if (bih.biBitCount==8)
{
fread(rgb,sizeof(rGBQUAD),256,in);//读取图像调色板数据
Imgdata=(BYTE *)malloc(bih.biSizeImage);//分配图像数据存储内存
fread(Imgdata,bih.biSizeImage,1,in);//读取位图像素数据
//free(Imgdata);
for (long i=0;i<Height;i++)
{
for (long j=0;j<width;j++)
{
BYTE data=Imgdata[LineByte*i+j];
if (Ogra[256]==0) Ogra[data]++;
Ngra[data]++;
}
}
if (Ogra[256]==0)
{
OWidth=width;
OHeight=Height;
Ogra[256]=-1;
}
}
}
fclose(in);
}
}
//分析bmp文件
void SQProcess(char *filename, long width, long height, long lev)
{
//-------------------------采样量化处理----------------------------
DWORD LineByte_O = WIDTHBYTES(bih.biWidth*bih.biBitCount);
DWORD LineByte_N = WIDTHBYTES(width*bih.biBitCount);
DWORD ImgSize_N = height*LineByte_N;
BYTE *Imgdata_N=(BYTE *)malloc(ImgSize_N);
//申请用于存储新图像像素数据的数组
BYTE R_data,G_data,B_data,Y_data;
long x,y;
if (bih.biBitCount==24)
{
for (long i=0;i<height;i++)
{
y=bih.biHeight/height*i;
for (long j=0;j<width;j++)
{
x=bih.biWidth/width*j;
B_data=Imgdata[LineByte_O*y+3*x];
G_data=Imgdata[LineByte_O*y+3*x+1];
R_data=Imgdata[LineByte_O*y+3*x+2];
//Y_data=(9798*R_data+19235*G_data+3735*B_data)/32768;//转换为灰度图像
Y_data=(3*R_data+6*G_data+1*B_data)/10;
Y_data=(BYTE)((Y_data/(256/lev))*(256/lev)+256/lev/2);//量化
Imgdata_N[i*LineByte_N+j*3]=Y_data;
Imgdata_N[i*LineByte_N+j*3+1]=Y_data;
Imgdata_N[i*LineByte_N+j*3+2]=Y_data;
/*Imgdata_N[i*LineByte_N+j*3]=((B_data/(256/lev))*(256/lev)+256/lev/2);
Imgdata_N[i*LineByte_N+j*3+1]=((G_data/(256/lev))*(256/lev)+256/lev/2);
Imgdata_N[i*LineByte_N+j*3+2]=((R_data/(256/lev))*(256/lev)+256/lev/2);*/
}
}
}
else if (bih.biBitCount==8)
{
for (long i=0;i<height;i++)
{
y=bih.biHeight/height*i;
for (long j=0;j<width;j++)
{
x=bih.biWidth/width*j;
Y_data=Imgdata[LineByte_O*y+x];
Y_data=(BYTE)((Y_data/(256/lev))*(256/lev)+256/lev/2);//量化
Imgdata_N[i*LineByte_N+j]=Y_data;
}
}
for (long i=0;i<256;i++)
rgb[i].rgbBlue=rgb[i].rgbGreen=rgb[i].rgbRed=(1*rgb[i].rgbBlue+6*rgb[i].rgbGreen+3*rgb[i].rgbRed)/10;
}
CreateBmpFile(filename,Imgdata_N,width,height);//创建新图像文件
free(Imgdata_N);
}
//采样量化处理主函数
void ITProcess(char *filename, int pro)
{
//-------------------------图像变换处理---------------------
- 1
- 2
前往页