用c语言写一个基于游程编码算法的图片压缩

时间: 2024-02-20 07:57:59 浏览: 31
好的,以下是基于游程编码算法的图片压缩的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_RLEN 255 // 定义游程编码结构体 struct rle { int len; int val; }; // 读取图片像素矩阵 void readPixels(unsigned char *pixels, int width, int height, FILE *f) { int count = 0; while (count < width * height) { int c = fgetc(f); if (c == EOF) { break; } pixels[count++] = (unsigned char)c; } } // 游程编码 int rle_encode(unsigned char *in, int len, struct rle **out) { *out = malloc(sizeof(struct rle) * len); if (*out == NULL) { return -1; } int count = 0, k = 0; for (int i = 0; i < len; i++) { (*out)[k].val = in[i]; count = 1; while (i < len - 1 && in[i] == in[i+1] && count < MAX_RLEN) { count++; i++; } (*out)[k].len = count; k++; } return k; } // 游程解码 void rle_decode(struct rle *in, int len, unsigned char *out) { int count = 0; for (int i = 0; i < len; i++) { for (int j = 0; j < in[i].len; j++) { out[count++] = (unsigned char)in[i].val; } } } // 压缩图片 void compressImage(unsigned char *pixels, int width, int height, char *filename) { FILE *f = fopen(filename, "wb"); if (f == NULL) { printf("Error: could not open file for writing\n"); return; } struct rle *rle_pixels; int rle_len = rle_encode(pixels, width * height, &rle_pixels); fwrite(&width, sizeof(int), 1, f); fwrite(&height, sizeof(int), 1, f); fwrite(rle_pixels, sizeof(struct rle), rle_len, f); fclose(f); } // 解压图片 void decompressImage(char *filename, unsigned char **pixels, int *width, int *height) { FILE *f = fopen(filename, "rb"); if (f == NULL) { printf("Error: could not open file for reading\n"); return; } fread(width, sizeof(int), 1, f); fread(height, sizeof(int), 1, f); struct rle *rle_pixels = malloc(sizeof(struct rle) * (*width) * (*height)); fread(rle_pixels, sizeof(struct rle), (*width) * (*height), f); *pixels = malloc((*width) * (*height)); rle_decode(rle_pixels, (*width) * (*height), *pixels); free(rle_pixels); fclose(f); } int main() { // 读取图片像素矩阵 FILE *f = fopen("input.pgm", "rb"); if (f == NULL) { printf("Error: could not open file for reading\n"); return -1; } char format[3]; fgets(format, 3, f); if (strcmp(format, "P5") != 0) { printf("Error: not a PGM file\n"); return -1; } int width, height, maxval; fscanf(f, "%d %d %d", &width, &height, &maxval); if (maxval > 255) { printf("Error: cannot handle PGM files with maxval > 255\n"); return -1; } unsigned char *pixels = malloc(width * height); readPixels(pixels, width, height, f); fclose(f); // 压缩图片 compressImage(pixels, width, height, "output.rle"); // 解压图片 unsigned char *decompressed_pixels; int decompressed_width, decompressed_height; decompressImage("output.rle", &decompressed_pixels, &decompressed_width, &decompressed_height); // 检查解压是否正确 if (decompressed_width != width || decompressed_height != height) { printf("Error: decompressed image has incorrect dimensions\n"); return -1; } for (int i = 0; i < width * height; i++) { if (pixels[i] != decompressed_pixels[i]) { printf("Error: decompressed image is incorrect\n"); return -1; } } printf("Compression and decompression successful\n"); free(pixels); free(decompressed_pixels); return 0; } ``` 这段代码实现了对PGM格式图片的压缩和解压缩。其中,`rle_encode()`函数实现了游程编码算法,将像素矩阵压缩成了一个游程编码数组;`rle_decode()`函数实现了游程解码算法,将游程编码数组解码成了一个像素矩阵。`compressImage()`函数将像素矩阵压缩成了文件,`decompressImage()`函数将压缩文件解压成了像素矩阵。程序通过读取PGM格式图片来进行测试,也可以通过修改代码以适应其他图片格式。

相关推荐

最新推荐

recommend-type

C语言字符串快速压缩算法代码

主要介绍了C语言字符串快速压缩算法代码,将字符串中连续出席的重复字母进行压缩,其主要的压缩字段的格式为”字符重复的次数+字符”。有需要的小伙伴参考下吧。
recommend-type

C语言中压缩字符串的简单算法小结

主要介绍了C语言中可用于实现字符串压缩的简单算法小结,列举了包括哈夫曼算法等三个核心的程序实现算法,需要的朋友可以参考下
recommend-type

基于C语言实现的迷宫算法示例

主要介绍了基于C语言实现的迷宫算法,结合具体实例形式分析了C语言解决迷宫问题算法的实现技巧与相关注意事项,需要的朋友可以参考下
recommend-type

基于C语言实现的aes256加密算法示例

主要介绍了基于C语言实现的aes256加密算法,结合具体实例形式详细分析了C语言实现的aes256加密算法实现步骤与使用技巧,需要的朋友可以参考下
recommend-type

C语言压缩文件和用MD5算法校验文件完整性的实例教程

主要介绍了C语言压缩文件和用MD5算法校验文件完整性的实例教程,这里演示了Windows下将文件压缩为7z格式以及MD5检验文件和密码的方法,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。