四叉树有损位图压缩处理程序示例
本文导语: 一个四叉树课设程序,可以对24位图进行压缩,应用于windows平台。 main.c 代码如下:#include "bmp.h" int main(){BITMAPFILEHEADER fileHeader;BITMAPINFOHEADER infoHeader;FILE* pfin1 =fopen("test.bmp","rb");FILE* pfout1 = fopen("test1.dat" , "wb");FILE* pfout2 = fopen("test2....
一个四叉树课设程序,可以对24位图进行压缩,应用于windows平台。
main.c
#include "bmp.h"
int main()
{
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
FILE* pfin1 =fopen("test.bmp","rb");
FILE* pfout1 = fopen("test1.dat" , "wb");
FILE* pfout2 = fopen("test2.bmp" , "wb");
FILE* pfin2 =fopen("test1.dat","rb");
quadtree_t T=NULL;
//Read the Bitmap file header;
fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin1);
//Read the Bitmap info header;
fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin1);
//为简化代码,只处理24位彩色
if( infoHeader.biBitCount == 24 )
{
//int size = infoHeader.biWidth*infoHeader.biHeight;
int size = infoHeader.biWidth*infoHeader.biHeight;
RGB *img=NULL;
img=(RGB*)malloc(infoHeader.biHeight*infoHeader.biWidth*sizeof(RGB));
if(img!=NULL)
{
fread( img , sizeof(RGB) , size , pfin1 );
fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout1 );
fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout1 );
treediv(&T,0,infoHeader.biWidth-1,0,infoHeader.biHeight-1,pfout1,img,infoHeader.biWidth);
free(img);
//将修改后的图片保存到文件
fclose(pfin1);
fclose(pfout1);
}
//将图片解压后还原
openbmp(pfin2,pfout2);
fclose(pfin2);
fclose(pfout2);
}
return 0;
}
func.c
#include "bmp.h"
//像素阀值函数
int ComparePixel(short int width1,short int width2,short int height1,short int height2,RGB *img,short int W)
{
RGB MAX,MIN;
int flag,i,j,clr1,clr2;
clr1=width2-width1;
clr2=height2-height1;
if(clr1sub[0]),width1,(width1+width2)/2,height1,(height1+height2)/2,S,div,w);
treediv(&((*T)->sub[1]),(width1+width2)/2+1,width2,height1,(height1+height2)/2,S,div,w);
treediv(&((*T)->sub[2]),(width1+width2)/2+1,width2,(height1+height2)/2+1,height2,S,div,w);
treediv(&((*T)->sub[3]),width1,(width1+width2)/2,(height1+height2)/2+1,height2,S,div,w);
}
else //如果标志位为真,则将该范围内像素统一
{
st.rgb.r=(*T)->pixel.r=(img[width1+height1*W].r+img[width2+height2*W].r)/2;
st.rgb.g=(*T)->pixel.g=(img[width1+height1*W].g+img[width2+height2*W].g)/2;
st.rgb.b=(*T)->pixel.b=(img[width1+height1*W].b+img[width2+height2*W].b)/2;
st.x1=width1; st.x2=width2; st.y1=height1; st.y2=height2;
fwrite( &st , sizeof(BLOCK) , 1 , S );
*T=NULL; free(*T);
//num++;
}
return 0;
}
//图像解压函数
void openbmp(FILE *S1,FILE *S2)
{
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,S1);
fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,S1);
BLOCK sti;
int p,q;
int size = infoHeader.biWidth*infoHeader.biHeight;
//RGB pic[infoHeader.biHeight][infoHeader.biWidth];
RGB *pic;
pic=(RGB*)malloc(infoHeader.biHeight*infoHeader.biWidth*sizeof(RGB));
while(!feof(S1))
{
fread(&sti,sizeof(BLOCK),1,S1);
int w1=sti.x1;int w2=sti.x2;
int h1=sti.y1;int h2=sti.y2;
for(p=h1;p
您可能感兴趣的文章:
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。