最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年04月14日 07:30:29   作者:  
這篇文章主要介紹了四叉樹有損位圖壓縮處理程序示例,可以對24位圖進行壓縮,應(yīng)用于windows平臺,需要的朋友可以參考下

一個四叉樹課設(shè)程序,可以對24位圖進行壓縮,應(yīng)用于windows平臺。

main.c

復(fù)制代碼 代碼如下:

#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

復(fù)制代碼 代碼如下:

#include "bmp.h"


//像素閥值函數(shù)
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)  //此函數(shù)用于判斷分割的圖片大小是否寬度與高度為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)) //閥值設(shè)為0xc0;
            {
                flag=0;
                return flag;                                     //flag為標(biāo)志位,決定是否繼續(xù)分割圖像
            }
        }
    }
    return flag;
}

//四叉樹分割函數(shù)(該函數(shù)的實參有待調(diào)整,特別是范圍那幾個參數(shù))!!!!!!!!!
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)                   //若標(biāo)志位為假,則進行遞歸分割
    {
        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 //如果標(biāo)志位為真,則將該范圍內(nèi)像素統(tǒng)一
    {
        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;
}

//圖像解壓函數(shù)
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

復(fù)制代碼 代碼如下:

#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;

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

 

/*像素文件存儲結(jié)構(gòu)*/
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

相關(guān)文章

  • 深入理解線程安全與Singleton

    深入理解線程安全與Singleton

    在編譯器未優(yōu)化的情況下順序如下:1.new operator分配適當(dāng)?shù)膬?nèi)存;2.在分配的內(nèi)存上構(gòu)造Singleton對象;3.內(nèi)存地址賦值給_instance
    2013-09-09
  • C語言詳細分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語言詳細分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,下面這篇文章主要給大家介紹了關(guān)于C語言內(nèi)存管理realloc、calloc、malloc、free函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • C語言獲取文件大小的兩種方式

    C語言獲取文件大小的兩種方式

    因為音視頻開發(fā)的需要,經(jīng)常會寫一些文件輸入輸出的測試程序,常常用到獲取文件大小的函數(shù),本篇文章就記錄一下常用的兩種獲取文件大小的方式,希望對大家有所幫助
    2023-11-11
  • C語言編程大小端問題示例詳解教程

    C語言編程大小端問題示例詳解教程

    這篇文章主要為大家介紹了C語言編程大小端問題解決的示例內(nèi)容詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • C++中關(guān)于多態(tài)實現(xiàn)和使用方法

    C++中關(guān)于多態(tài)實現(xiàn)和使用方法

    這篇文章主要介紹了C++中關(guān)于多態(tài)實現(xiàn)和使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++之list容器模擬實現(xiàn)方式

    C++之list容器模擬實現(xiàn)方式

    這篇文章主要介紹了C++之list容器模擬實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言 makefile學(xué)習(xí)及實現(xiàn)實例

    C語言 makefile學(xué)習(xí)及實現(xiàn)實例

    這篇文章主要介紹了C語言 makefile學(xué)習(xí)及實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++設(shè)計模式之命令模式

    C++設(shè)計模式之命令模式

    這篇文章主要介紹了C++設(shè)計模式之命令模式,本文講解了什么是命令模式、命令模式的使用場合等內(nèi)容,并給出了一個代碼實例,需要的朋友可以參考下
    2014-10-10
  • Opencv檢測多個圓形(霍夫圓檢測,輪廓面積篩選)

    Opencv檢測多個圓形(霍夫圓檢測,輪廓面積篩選)

    本文主要介紹了Opencv檢測多個圓形(霍夫圓檢測,輪廓面積篩選),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 簡要介紹C++編程中的友元函數(shù)和友元類

    簡要介紹C++編程中的友元函數(shù)和友元類

    這篇文章主要介紹了C++編程中的友元函數(shù)和友元類,屬于較為冷僻的知識,在實際開發(fā)中較少使用,需要的朋友可以參考下
    2015-09-09

最新評論

宝坻区| 沧州市| 乌兰浩特市| 辽阳县| 新泰市| 滦平县| 盐边县| 休宁县| 曲麻莱县| 无为县| 延庆县| 铜鼓县| 明星| 大冶市| 嘉义市| 玛沁县| 轮台县| 辽宁省| 沧州市| 固阳县| 吴忠市| 同仁县| 北碚区| 长乐市| 万载县| 三门县| 县级市| 淳化县| 广饶县| 昭苏县| 西藏| 宜宾县| 莲花县| 环江| 万安县| 读书| 丹巴县| 静海县| 余江县| 潼南县| 格尔木市|