PGM 格式图像数据操作
1、结构定义
struct stPGMImage
{int width; // 宽int height; // 高int type; // 类型int maxraw; // 最大像素unsigned char* data;// 数据
};
2、文件读取
struct stPGMImage* OpenPGM(char* filename)
{FILE* fp;if ((fp = fopen(filename, "rb")) == NULL){printf("read error...\n");return NULL;}struct stPGMImage* image = (struct stPGMImage*)malloc(sizeof(struct stPGMImage));int c;int i, j;int val;unsigned char* line;char buf[1024];while ((c = fgetc(fp)) == '#')fgets(buf, 1024, fp);ungetc(c, fp);if (fscanf(fp, "P%d\n", &c) != 1){printf("read error ....");free(image);return NULL;}if (c != 5 && c != 2){printf("read error ....");free(image);return NULL;}if (c == 5){image->type = c;while ((c = fgetc(fp)) == '#')fgets(buf, 1024, fp);ungetc(c, fp);if (fscanf(fp, "%d%d%d", &image->width, &image->height, &image->maxraw) != 3){printf("failed to read width/height/max\n");free(image);return NULL;}//printf("Width=%d, Height=%d \nMaximum=%d\n", image->width, image->height, image->maxraw);image->data = (unsigned char*)malloc(sizeof(unsigned char) * image->width * image->height);getc(fp);line = (unsigned char*)malloc(sizeof(unsigned char) * image->width);for (j = 0; j < image->height; j++){fread(line, 1, image->width, fp);for (i = 0; i < image->width; i++){image->data[j * image->width + i] = line[i];}}free(line);}else if (c == 2){image->type = c;while ((c = fgetc(fp)) == '#')fgets(buf, 1024, fp);ungetc(c, fp);if (fscanf(fp, "%d%d%d", &image->width, &image->height, &image->maxraw) != 3){printf("failed to read width/height/max\n");free(image);return NULL;}//printf("Width=%d, Height=%d \nMaximum=%d,\n", image->width, image->height, image->maxraw);image->data = (unsigned char*)malloc(sizeof(unsigned char) * image->width * image->height);getc(fp);for (j = 0; j < image->height; j++)for (i = 0; i < image->width; i++){fscanf(fp, "%d", &val);image->data[j * image->width + i] = val;}}fclose(fp);return image;
}
3、数据保存
void SavePGM(struct stPGMImage *image, char* filename)
{FILE* fp;if ((fp = fopen(filename, "wb")) == NULL) {printf("write pgm error....\n");return ;}//printf("Width_dst=%d, Height_dst=%d \nMaximum=%d\n", image->width, image->height, image->maxraw);fprintf(fp, "P5\n%d %d\n%d\n", image->width, image->height, image->maxraw);int i, j;for (j = 0; j < image->height; j++){for (i = 0; i < image->width; i++){fputc(image->data[j * image->width + i], fp);}}fclose(fp);
}
友情提醒:因项目需要,只对P5格式进行解析。
PGM 格式图像数据操作相关推荐
- DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”
背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...
- DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”
背景: 续上篇,继续介绍如何将多幅JPG图像数据存入DCM文件.即将有损压缩数据直接写入DCM文件,存储为Multi-frame形式. 多幅JPG图像数据存入DCM文件: 为了避免引起歧义,这里着重说 ...
- matlab对nii文件处理,使用Nibabel库对nii格式图像的读写操作
因为后期主要的研究方向是医学图像处理,而现有手头的大部分数据都是nii格式或者是hdr,img格式的数据,所以首先第一步我们需要解决图像的读写问题. 其实使用OpenCV也可以方便的进行图像读取,但是 ...
- TF:利用TF读取数据操作,将CIFAR-10 数据集中的训练图片读取出来,并保存为.jpg格式
TF:利用TF读取数据操作,将CIFAR-10 数据集中的训练图片读取出来,并保存为.jpg 格式 目录 输出结果 核心代码 输出结果 核心代码 def inputs_origin(data_dir) ...
- 医学图像处理——数据预处理(.mhd+raw格式图像读取和显示)
数据预处理(.mhd+raw格式图像读取和显示) 说明: 1.mhd+raw背景 2..mhd说明图像数据的信息 3.Python读取和显示mhd图像数据 3.1python库的安装 3.1代码运行展 ...
- Python遥感图像处理应用篇(三十):图片格式转为具有空间坐标的遥感图像数据(Jpg2Geotiff)
最近在调试一段代码,该代码输入数据为遥感图像,但是计算出的图像分类结果使用jpg(png等)图片格式保存的输出结果,作为一个遥感工作者,显然更想得到一个具有空间位置信息的遥感图像,比如Geotiff格 ...
- 保存图像数据为BMP格式的图片
BMP文件是Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件. BMP文件结构 BMP图像文件包括四 ...
- Kinect V1读取图像数据(For Windows)
Kinect V1读取图像数据(For Windows) 这篇博客 Kinect V1介绍 数据读取的基本流程 运行代码和注释 结尾 这篇博客 刚好有一台现成的Kinect V1相机,所以就拿过来学 ...
- LabVIEW读写各类格式图像的方法(基础篇—1)
目录 1.读写各类格式图像的方法 1.1.LabVIEW集成图像读写函数 1.2.Nl Vision图像读写函数 2.小试牛刀 图像数据被采集至内存缓冲区后,机器视觉软件即可对其施加各种图像预处理.图 ...
最新文章
- 了解因果论:从珀尔的《为什么》开始
- dijkstra算法matlab程序_编程习题课 | 用最短路算法为你的小地图导航
- NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码
- android chrome iframe设置src属性无法启动app
- 前端为什么非要动静分离 说一下CDN托管的意义
- Quick-Cocos2d-x初学者游戏教程2
- markdown如何修改为 微软雅黑 字体
- java url解码_如何从REST WebService 调用中解码路径参数
- 联想重装系统去掉保护_带有联想保护系统的电脑安装系统具体步骤如下
- 线性代数知识点汇总:行列式和矩阵
- C4认证Java基础Excel练习题
- GT9xxxxx系列------如何加入电源管理模块
- 计算机毕业设计ssm焦虑自测与交流平台k43cf系统+程序+源码+lw+远程部署
- 小测试整理(含T1 T2)
- The Sandbox 开启 2022 年新征途,Mega City 土地销售来啦
- MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O
- 学习Flask之blueprint
- Qt 之 QuaZIP(zip 压缩/解压缩)
- 数据库-------关系数据库标准语言SQL
- YoloV4自己样本制作和训练
热门文章
- Java 多线程线程安全(面试概念解答二)
- java机票实时比价系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
- Web常用的服务器软件整理(Win+Linux)
- 阴阳师服务器维护3月25日,《阴阳师》手游3月21日维护更新公告
- 使用 easypoi 导出 excel 实现动态列,完美解决!
- 展讯平台GPIO调试方法
- opencv学习---计算图像的水平积分投影和垂直积分投影
- Nginx学习日记1
- 跟着iMeta学做图|ComplexHeatmap包绘制热图展示不同样本物种相对丰度
- 小巧实用的pdf阅读器