亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

四叉樹有損位圖壓縮處理程序示例

2020-01-26 15:32:36
字體:
來源:轉載
供稿:網友

一個四叉樹課設程序,可以對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(clr1<3||clr2<3)  //此函數用于判斷分割的圖片大小是否寬度與高度為1;
    {
        flag=1;
        return flag;
    }
    MAX.b=MIN.b=img[height1*W+width1].b;
    MAX.g=MIN.b=img[height1*W+width1].g;
    MAX.r=MIN.b=img[height1*W+width1].r;
    flag=1;
    for(i=height1;i<=height2;i++)
    {
        for(j=width1;j<=width2;j++)
        {
            if(img[i*W+j].r>MAX.r) MAX.r=img[i*W+j].r;
            else if(img[i*W+j].r<MIN.r) MIN.r=img[i*W+j].r;
            if(img[i*W+j].g>MAX.g) MAX.g=img[i*W+j].g;
            else if(img[i*W+j].g<MIN.g) MIN.g=img[i*W+j].g;
            if(img[i*W+j].b>MAX.b) MAX.b=img[i*W+j].b;
            else if(img[i*W+j].b<MIN.b) MIN.b=img[i*W+j].b;
            if((MAX.r-MIN.r>0x14)||(MAX.g-MIN.g>0x14)||(MAX.b-MIN.b>0x14)) //閥值設為0xc0;
            {
                flag=0;
                return flag;                                     //flag為標志位,決定是否繼續分割圖像
            }
        }
    }
    return flag;
}

//四叉樹分割函數(該函數的實參有待調整,特別是范圍那幾個參數)!!!!!!!!!
int treediv(quadtree_t *T,short int width1,short int width2,short int height1,short int height2,FILE* S,RGB *img,short int W)
{
    int flag=0;
    RGB *div;
    div=img;
    short int x1=width1,x2=width2;
    short int y1=height1,y2=height2;
    int w=W;
    flag=ComparePixel(x1,x2,y1,y2,div,w);
    if(!((*T) = (quadnode_t*)malloc(sizeof(quadnode_t))))
        return 0;
    if(!flag)                   //若標志位為假,則進行遞歸分割
    {
        treediv(&((*T)->sub[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<=h2;p++)
        {
            for(q=w1;q<=w2;q++)
            {
                pic[p*infoHeader.biWidth+q].b=sti.rgb.b;
                pic[p*infoHeader.biWidth+q].g=sti.rgb.g;
                pic[p*infoHeader.biWidth+q].r=sti.rgb.r;
            }
        }
    }
    fwrite( &fileHeader , sizeof(fileHeader) , 1 , S2 );
    fwrite( &infoHeader , sizeof(infoHeader) , 1 , S2 );
    fwrite(pic,sizeof(RGB),size,S2);
}

bmp.h

復制代碼 代碼如下:

#ifndef BMP_H_INCLUDED
#define BMP_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

/*像素類型*/
typedef struct{
BYTE b;
BYTE g;
BYTE r;
}RGB;

/*四叉樹結點類型*/
typedef struct quadnode_t
{
    RGB pixel;
    struct quadnode_t *sub[4];
}quadnode_t,*quadtree_t;

 

/*像素文件存儲結構*/
typedef struct block
{
    RGB rgb;
    short int x1,x2,y1,y2;
}BLOCK;

BLOCK st;

//static int num=0;

int treediv(quadtree_t *T,short int width1,short int width2,short int height1,short int height2,FILE* S,RGB *img,short int W);
int ComparePixel(short int width1,short int width2,short int height1,short int height2,RGB *img,short int W);
void openbmp(FILE *S1,FILE *S2);
#endif // BMP_H_INCLUDED

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成网7777777国产| 日韩中文字幕在线观看| 日韩欧美一区二区三区| 国产女人18毛片水18精品| 国产一区二区丝袜高跟鞋图片| 一区二区三区久久精品| 91在线国产电影| 久久免费视频网站| 国产精品对白刺激| 亚洲自拍小视频免费观看| 欧美亚洲另类视频| 国产性猛交xxxx免费看久久| 精品动漫一区二区三区| 亚洲精品色婷婷福利天堂| 中文在线资源观看视频网站免费不卡| 久久久亚洲国产| 国产成人福利网站| 91精品国产777在线观看| 在线午夜精品自拍| 欧洲一区二区视频| 国产小视频91| 亚洲精品美女在线观看| 国产狼人综合免费视频| 国产精品综合久久久| 性色av一区二区三区红粉影视| 亚洲人成欧美中文字幕| 成人h片在线播放免费网站| 成人黄色片在线| 九九久久久久久久久激情| 国产最新精品视频| 亚洲欧美国产精品| 日韩极品精品视频免费观看| 清纯唯美日韩制服另类| 亚洲国产精品电影| 欧美成人午夜激情视频| 操日韩av在线电影| 国产精品极品美女粉嫩高清在线| 国产精品a久久久久久| 欧美日韩午夜剧场| 久久这里只有精品视频首页| 亚洲老头同性xxxxx| 亚洲一区二区三区四区在线播放| 欧美自拍视频在线观看| 国产日韩欧美视频| 亚洲已满18点击进入在线看片| 国产精品亚洲欧美导航| 91精品国产91久久久久久| 九九九久久久久久| 欧美成人性色生活仑片| 北条麻妃一区二区三区中文字幕| 国产一区av在线| 久久这里有精品视频| 国产精品美腿一区在线看| 亚洲激情免费观看| 91手机视频在线观看| 亚洲乱亚洲乱妇无码| 国产精品麻豆va在线播放| 欧美xxxx18性欧美| 日韩精品一二三四区| 国产精品一区二区三区久久| 成人黄色激情网| 国内精品久久久久久久| 午夜精品99久久免费| 欧美激情精品在线| 丝袜亚洲另类欧美重口| 亚洲成年人影院在线| 亚洲女人被黑人巨大进入| 久久久久久久久久国产| 日韩美女写真福利在线观看| 成人激情视频小说免费下载| 久久青草精品视频免费观看| 欧美裸体xxxx| 国产一区二区三区日韩欧美| 中文字幕日韩免费视频| 中文字幕精品一区久久久久| 色狠狠av一区二区三区香蕉蜜桃| 国产精品久久久av久久久| 日韩成人av在线| 日韩中文字幕在线看| 中文字幕欧美国内| 国产成人精品亚洲精品| 国产精品免费一区豆花| 在线视频亚洲欧美| 91午夜在线播放| 久久福利视频网| 国产v综合v亚洲欧美久久| 久久99久久99精品中文字幕| 亚洲人成绝费网站色www| 精品国产一区二区三区久久狼5月| 国内免费久久久久久久久久久| 亚洲国产女人aaa毛片在线| 欧美—级a级欧美特级ar全黄| 超碰精品一区二区三区乱码| 欧美电影在线免费观看网站| 日韩欧美在线中文字幕| 国产精品久久久久国产a级| 亚洲一区二区三区久久| 欧美国产日韩一区| 欧美精品久久久久久久久久| 中文字幕国产精品久久| 这里只有精品丝袜| 日本精品久久中文字幕佐佐木| 久久视频这里只有精品| 国产欧美日韩中文字幕| 精品中文字幕久久久久久| 国内精品久久久久| 日韩中文综合网| 亚洲第一精品电影| 九九视频直播综合网| 久久精品视频在线观看| 国产在线拍揄自揄视频不卡99| 欧美性理论片在线观看片免费| 亚洲精选一区二区| 国产欧美精品在线播放| 精品久久久久久久大神国产| 日本午夜人人精品| 欧美激情视频三区| 欧美日韩一二三四五区| 亚洲午夜未满十八勿入免费观看全集| 日韩av手机在线观看| 国产婷婷成人久久av免费高清| 亚洲男人的天堂网站| 尤物99国产成人精品视频| 国产日韩欧美91| 欧美性猛交xxxx黑人猛交| 国产精品爽黄69天堂a| 国产精品入口日韩视频大尺度| 亚洲精品videossex少妇| 国产精品手机播放| 国产精品人成电影在线观看| 777国产偷窥盗摄精品视频| 夜夜躁日日躁狠狠久久88av| 日本一区二区不卡| 91精品免费看| 日韩高清欧美高清| 91丝袜美腿美女视频网站| 久久天天躁狠狠躁夜夜躁2014| 91在线观看免费高清完整版在线观看| 日韩av中文字幕在线| 亚洲码在线观看| 国产精品丝袜一区二区三区| 91大神在线播放精品| 成人激情视频在线观看| 日韩成人在线免费观看| …久久精品99久久香蕉国产| 国产99视频精品免视看7| 国产精品吊钟奶在线| 欧美高清激情视频| 日韩一二三在线视频播| 日韩电影大片中文字幕| 国产ts一区二区| 久久精品夜夜夜夜夜久久| 日本精品一区二区三区在线| 欧美激情xxxxx| 国产精品1234| 高跟丝袜欧美一区| 国产精品人人做人人爽| 欧美成人精品一区二区三区| 97av视频在线| 人妖精品videosex性欧美| 欧美壮男野外gaytube| 国产精品免费在线免费| 精品久久久久久久久久国产| 亚洲网站在线看|