• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 四叉树有损位图压缩处理程序示例

四叉树有损位图压缩处理程序示例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了四叉树,四叉树编码,四叉树算法,四叉树分割,四叉树空间索引等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一个四叉树课设程序,可以对24位图进行压缩,应用于windows平台。

main.c


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;
}
</div>

func.c


//像素阀值函数
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;
 &nbs

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++实现四叉树效果(附源码下载)
  • 四叉树有损位图压缩处理程序示例

相关文章

  • 2022-04-30分析第一个C语言程序
  • 2017-05-28深入解析设计模式中的适配器模式在C++中的运用
  • 2017-05-28Species Tree 利用HashTable实现实例代码
  • 2017-08-17c计算闰年
  • 2017-05-28C++学习小结之数据类型及转换方式
  • 2017-05-28解析linux 文件和目录操作的相关函数
  • 2017-05-28C语言中的sizeof操作符用法及和strlen的区别
  • 2017-05-28Java3D实例之创建空间几何模型的实现方法
  • 2017-05-28C++设计模式之适配器模式
  • 2017-09-12c语言 time.h 详细介绍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言递归操作用法总结
    • C++中的异常处理机制详解
    • vc获取计算机名和ip地址的方法
    • C字符串操作函数实现方法小结
    • VC++实现输出GIF到窗体并显示GIF动画的方法
    • 文件编译时出现multiple definition of 'xxxxxx'的具体解决方法
    • Cocos2d-x中CCEditBox文本输入框的使用实例
    • 用32位int型变量表示单引号括起来的四个字符的深入探讨
    • c语言strftime时间格式化示例
    • 用C语言程序判断大小端模式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有