#include <stdio.h>
#include <math.h>
#include<Windows.h>
#include <commdlg.h>
#include"resource.h"
#include <stdlib.h>
typedef struct QuadTreeNode // 用于获取图像信息的结点
{
unsigned char uclr; //颜色(灰度)
int il; //记录是否为叶子结点,0为非叶子结点,1为叶子结点
int isx; //像素的起始横坐标位置
int isy; //像素的起始纵坐标位置
int ifx; //像素的终止横坐标位置
int ify; //像素的终止纵坐标位置
char ilev; //树的层数
struct QuadTreeNode *children[4]; //指向4个孩子结点的指针
//struct QuadTreeNode *next; //指向兄弟结点的指针
} QTree, *pQtre;
typedef struct //用于保存图像信息的结点(当需要压缩的图像像素超过256X256)
{
short ix; //保存后的起始横坐标
short iy; //保存后的起始纵坐标
unsigned char unclr; //保存后的颜色(灰度)
unsigned char islv; //保存后的层数
} sQtre;
typedef struct //用于保存图像信息的结点(当需要压缩的图像像素小于等于256X256)
{
unsigned char ixm; //保存后的起始横坐标
unsigned char iym; //保存后的起始纵坐标
unsigned char unclrm; //保存后的颜色(灰度)
unsigned char islvm; //保存后的层数
}sQtrem;
//全局变量
unsigned char *rpbmpbuf = NULL; //读取图像指针
unsigned char *wpbmpbuf = NULL; //写入图像指针
//全局变量
int bmpWidth; //图像宽度
int bmpHeight; //图像高度
int lineByte; //一行的像素值
char m=0; //保存当前的层数
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型,每像素位数
int threshold_value = 3;//阀值大小
int number = 0;//记录节点个数
sQtre *fbuffer, *rbuffer;
sQtrem *fbufferm, *rbufferm;
static OPENFILENAME ofn ;
static TCHAR szFilter_C[] = TEXT ("*.BMP\0*.bmp\0") ;
static TCHAR szFilter_U[] = TEXT ("*.DATA\0*.data\0") ;
pQtre create_quadtree(int isx, int isy, int ifx, int ify, int lev);
void save_quad_tree(char *name, pQtre head);
void visit_quad_tree(pQtre head);
BOOL unload(char * name);
/***********************************************************************
* 函数名称:
* init()
*函数参数:
* 无
*返回值:
* 无
*说明:初始化所有全局变量
***********************************************************************/
void init()
{
rpbmpbuf = NULL;
wpbmpbuf = NULL;
bmpWidth = 0;
bmpHeight = 0;
lineByte = 0;
pColorTable = NULL;
biBitCount = 0;
number = 0;//记录节点个数
fbuffer = NULL;
rbuffer = NULL;
}
void PopFileInitialize (HWND hwnd, TCHAR* SZFilter)
{
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = hwnd ;
ofn.hInstance = NULL ;
ofn.lpstrFilter = SZFilter ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.lpstrFile = NULL ; // Set in Open and Close functions
ofn.nMaxFile = MAX_PATH ;
ofn.lpstrFileTitle = NULL ; // Set in Open and Close functions
ofn.nMaxFileTitle = MAX_PATH ;
ofn.lpstrInitialDir = NULL ;
ofn.lpstrTitle = NULL ;
ofn.Flags = 0 ; // Set in Open and Close functions
ofn.nFileOffset = 0 ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = NULL ;
ofn.lCustData = 0L ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
}
BOOL PopFileUzipDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
int i;
char pMBBuffer[MAX_PATH];
PopFileInitialize (hwnd, szFilter_U);
ofn.lpstrFile = pstrFileName ;
ofn.lpstrFileTitle = pstrTitleName ;
ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;
if(!GetOpenFileName (&ofn))
return FALSE;
wcstombs_s(&i, pMBBuffer, (size_t)MAX_PATH, pstrFileName, (size_t)MAX_PATH );
if(!unload(pMBBuffer))
return FALSE;
for(i = 0;; i++)
if(pMBBuffer[i] == '.')
break;
pMBBuffer[i++] = 'c';
pMBBuffer[i++] = 'p';
pMBBuffer[i++] = 'y';
pMBBuffer[i++] = '.';
pMBBuffer[i++] = 'b';
pMBBuffer[i++] = 'm';
pMBBuffer[i++] = 'p';
pMBBuffer[i++] = '\0';
saveBmp(pMBBuffer, wpbmpbuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
free(wpbmpbuf);
wpbmpbuf = NULL;
return TRUE;
}
BOOL PopFileComDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
int i;
char pMBBuffer[MAX_PATH];
pQtre head;
PopFileInitialize (hwnd, szFilter_C);
ofn.lpstrFile = pstrFileName ;
ofn.lpstrFileTitle = pstrTitleName ;
ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;
if(!GetOpenFileName (&ofn))
return FALSE;
wcstombs_s(&i, pMBBuffer, (size_t)MAX_PATH, pstrFileName, (size_t)MAX_PATH );
readBmp(pMBBuffer);
head = create_quadtree(0, 0, lineByte, bmpHeight,0);
free(rpbmpbuf);
rpbmpbuf = NULL;
wpbmpbuf = (unsigned char*)malloc(sizeof(char)*lineByte*bmpHeight);
for(i = 0; ; i++)
if(pMBBuffer[i] == '.')
break;
pMBBuffer[++i] = 'd';
pMBBuffer[++i] = 'a';
pMBBuffer[++i] = 't';
pMBBuffer[++i] = 'a';
pMBBuffer[++i] = '\0';
save_quad_tree(pMBBuffer, head);
return TRUE;
}
/***********************************************************************
* 函数名称:
* readBmp()
*函数参数:
* char *bmpName -文件名字及路径
*返回值:
* 0为失败,1为成功
*说明:给定一个图像文件名及其路径,读图像的位图数据、宽、高、颜色表及每像素
* 位数等数据进内存,存放在相应的全局变量中
***********************************************************************/
BOOL readBmp(char *bmpName)
{
BITMAPINFOHEADER head;
FILE *fp;
//二进制读方式打开指定的图像文件
fp = fopen(bmpName,"rb");
if(fp==0) return 0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
//获取图像宽、高、每像素所占位数等信息
bmpWidth = head.biWidth;
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;
//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
lineByte=(bmpWidth * biBitCount/8+3)/4*4;
//灰度图像有颜色表,且颜色表表项为256
if(biBitCount==8)
{
pColorTable = (RGBQUAD*)malloc(256*sizeof(RGBQUAD));//申请存储空间
fread(pColorTable,sizeof(RGBQUAD),256,fp);//读颜色表进内存
}
//申请位图数据所需要的空间,读位图数据进内存
rpbmpbuf = (unsigned char*)malloc(bmpHeight*lineByte*sizeof(char));
fread(rpbmpbuf, 1, bmpHeight*lineByte, fp);
//关闭文件
fclose(fp);
return 1;
}
/*****************************************
* 函数名称:
* saveBmp()
*函数参数:
* char *bmpName-文件名字及路径
* unsigned char *imgBuf-待存盘的位图数据
* int width-以像素为单位待存盘位图的宽
* int height-以像素为单位待存盘位图高
* int biBitCount-每像素所占位数
* RGBQUAD *pColorTable-颜色表指针
*返回值:
* 0为失败,1为成功
*说明:给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,
* 将其写到指定文件中
***********************************************************************/
BOOL saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,
int biBitCount, RGBQUAD *pColorTable)
{
int colorTablesize;
int lineByte;
FILE *fp;
BITMAPFILEHEADER fileHead;
BITMAPINFOHEADER head;
//如果位图数据指针为0,则没有数据传入,函数返回
if(!imgBuf)
return 0;
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存储图像数据每行字节数为4的倍数
lineByte=(width *
基于四叉树的图像压缩软件(源代码)
需积分: 12 137 浏览量
2014-04-23
23:49:35
上传
评论 1
收藏 366KB ZIP 举报
wto1314159
- 粉丝: 1
- 资源: 1
最新资源
- 杨辉三角(Pascal's Triangle)是一个在数学中非常著名的数列,它以一种特定的模式排列数字,内容以5种代码实例实现
- yolov5数据集:CT图像肾脏、结石检测(2类别,包含训练集、验证集)
- 电力102规约请求报文实录
- RTL8723 linux+安卓驱动 2020版本
- ISO 26262 道路车辆-功能安全-系统级产品开发
- 数据挖掘期末题 选择填空简答
- EKF在CTRV模型上的建模推导
- 用于:https://laoshifu.blog.csdn.net/article/details/138191428 多层创建
- 电力102规约(电能累计量的传输规约)培训
- 「常用」E9外部流程接口
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈