C# PGM格式图像与BMP格式图像相互转换

关于PGM文件格式的详细介绍请参考https://blog.csdn.net/xiaoxin_ling/article/details/3980642

//PGM转BMP/BMP转PGM类class PGM2BMP{private static ColorPalette grayScale;//定义调色板类public Bitmap PGMToBitmap(string filePath)//PGM 转 BMP{using (FileStream fs = new FileStream(filePath, FileMode.Open)){using (BinaryReader reader = new BinaryReader(fs, Encoding.ASCII)){if (reader.ReadChar() == 'P' && reader.ReadChar() == '5')//针对P5类型的PGM文件,适用于P5类型的PGM文件,对于P2类型的PGM类型的图像文件需要修改{reader.ReadChar();               //读完当前行的结束符“\n”,切换至下一行if (reader.PeekChar() == '#')    //有的PGM文件中含有#开头的行,这个是comment{while (reader.PeekChar() != '\n'){reader.ReadChar();}reader.ReadChar();}StringBuilder sbTemp = new StringBuilder();int width = ReadNumber(reader, sbTemp);   //获取图片宽int height = ReadNumber(reader, sbTemp);  //获取图片高int level = ReadNumber(reader, sbTemp);   //获取图片像素中最高像素值bool bTwo = (level > 255);             //一个像素占字节数,默认占1byteBitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);if (grayScale == null){grayScale = bmp.Palette;for (int i = 0; i < 256; i++){grayScale.Entries[i] = Color.FromArgb(i, i, i);}}bmp.Palette = grayScale;BitmapData dt = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);int offset = dt.Stride - dt.Width;//位图要求像素宽为4的整数倍,因此当被转换图像宽不是4的整数倍时就会有偏差,最大位3个像素//指针的使用必须放在unsafe的区域里unsafe{byte* ptr = (byte*)dt.Scan0;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){byte v;if (bTwo){v = (byte)(((double)((reader.ReadByte() << 8) + reader.ReadByte()) / level) * 255.0);}else{v = reader.ReadByte();}*ptr = v;ptr++;}ptr += offset;}}bmp.UnlockBits(dt);return bmp;}else{throw new InvalidOperationException("Target file is not a PGM file");}}}}public void SaveAsBitmap(string src, string dest){PGMToBitmap(src).Save(dest, ImageFormat.Bmp);}private int ReadNumber(BinaryReader reader, StringBuilder sb){char c = '\0';sb.Length = 0;while (Char.IsDigit(c = reader.ReadChar())){sb.Append(c);}return int.Parse(sb.ToString());}/// <summary>/// 将bmp保存为PGM格式文件(P5)/// </summary>/// <param name="bm"></param>/// <param name="iw"></param>/// <param name="ih"></param>/// <param name="icolor"></param>/// <param name="filePath"></param>public void WritePGM(Bitmap bm, int iw, int ih, int icolor, string filePath){string PGMINfo = "P5" + Convert.ToChar(10) + '#'+ "Generated by OpenCV 3.3.1-dev" + Convert.ToChar(10) +iw.ToString() + " " +ih.ToString() + Convert.ToChar(10) +icolor.ToString() + Convert.ToChar(10);FileStream OutputStream = File.Create(filePath);BinaryWriter PGMWriter = new BinaryWriter(OutputStream);byte[] PGMInfoBuffer = System.Text.ASCIIEncoding.Default.GetBytes(PGMINfo);PGMWriter.Write(PGMInfoBuffer);byte[] data = new byte[iw*ih];for (int j = 0; j < ih; j++){for (int i = 0; i < iw; i++){data[i + j * iw] = (byte)bm.GetPixel(i, j).R;}}PGMWriter.Write(data);PGMWriter.Close();}}

注意:类中使用了unsafe关键字,直接使用会报错,编译无法通过。
error CS0227: 不安全代码只会在使用 /unsafe 编译的情况下出现
解决:VS2017下,项目-》右键-》属性-》生成: 将“允许不安全代码(F)”勾选上,重新编译即可。

参考Demo链接https://download.csdn.net/download/CXYLVCHF/13986132

C# PGM格式图像与BMP格式图像相互转换相关推荐

  1. BMP格式知识之三:bmp格式的编解码

    bmp格式的编解码 BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持.随着Windows操作系统的流行与丰富的Window ...

  2. RAW格式图像转为BMP格式

    首先先介绍C++中图像数据分配内存方法. 在计算机中图像是一个二维的数字点阵. 比较容易想到的是申请一个二维矩阵来存储图像 如: BYTE image[512][512]; 可以存储一幅512*512 ...

  3. C语言将raw转为bmp,RAW格式数据转BMP格式数据

    1.BMP文件结构,注意字节对齐 __packed struct tagBITMAPFILEHEADER { T_U16 bfType; T_U32 bfSize; T_U16 bfReserved1 ...

  4. 将bmp图像转换为ppm格式

    实现图像格式的转化,将bmp的彩色图像转化为其他简单格式,便于使用. Cvt_BMP_to_PPM程序说明: 功能:将bmp格式的彩色图像保存为ppm格式:       将bmp格式的灰度图像保存为p ...

  5. 如何批量将 bmp 格式图片转换转换为 jpg

    概要:png 和 jpg 这两种格式的图片相信大家都非常熟悉,但是 bmp 格式的图片可能大家接触得并没有那么多,bmp 是 Windows 操作系统中的标准图像文件格式,能够被多种 Windows ...

  6. matlab产生bmp图片,matlab 生成.bmp格式的文件

    生成.bmp格式的文件 .bmp格式的图片是未压缩的图片,相比于.raw格式,需要加上头文件.下面以大小为M*N的图片为例,说明头文件格式和内容. M = 128; N = 128; % 构造头文件 ...

  7. TensorFlow学习笔记之 bmp格式、txt格式数据转换成tfrecord 格式

    目录 一.前言 二.bmp 格式数据转换成 tfrecord 格式的代码 三.txt 格式数据转换成 tfrecord 格式的代码 一.前言 之前我们讲过了关于 tfrecord 格式的相关内容,在这 ...

  8. bmp qimage 保存位_Qt QImag图像保存、格式转换

    图像保存 bool QImage::save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1 ...

  9. 关于BMP格式图像的理解和读写(c++).docx

    一.什么是BMP格式? BMP,(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广.它采用位映射存储格式,除了图 ...

  10. python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

最新文章

  1. R语言xgboost包:使用xgboost算法实现随机森林(random forest)模型
  2. Quartz学习笔记
  3. C#后台获取数据库数据--ADO.NET
  4. 将jar文件转换成exe可执行文件
  5. HtmlUnit优秀文章
  6. centos 怎样下载php,centos下怎样安装软件
  7. PreScan轨迹mat文件数据格式
  8. 项目疑难杂症记录(四):Activity被重新创建的原因分析
  9. vs2008 代码对齐方式
  10. [转载] Python3 字典 values() 方法
  11. 申通完美支撑“双11”亿级包裹背后的云基础设施
  12. [Mac A]为什么国外程序员爱用 Mac?
  13. android抢qq红包源码,QQ抢红包插件实现,安卓源码,以及详细分析,androidqq抢红包源码,捡代码论坛整理...
  14. ubuntu英伟达显卡驱动
  15. html页面内容的收缩和展开效果,jquery简单实现网页层的展开与收缩效果
  16. 朋友让帮忙写个理发店的会员信息管理系统...
  17. croeldraw基本知识点
  18. tags与categories
  19. 云计算技术 - 基础环境搭建
  20. Android11不如,1200万像素的iPhone11真的不如4800万像素的安卓?

热门文章

  1. 【C语言】字符串、字符数组
  2. 顾客价值理论(转载)
  3. PHP开源公司订餐系统Food Online System Version1.6
  4. Automatic classification of defective photovoltaic module cells in electroluminescence images-论文阅读笔记
  5. vue使用mavon-editor编辑器,外链保存到本地,且A标签外链和图片外链的处理
  6. 海天老师 资深TTT/思维训练专家
  7. 计算机日志存储在哪里,Win7系统日志存放位置的更改
  8. EasyUI 日历实现日程提醒
  9. 初中数学503个必考知识点_高考数学必考知识点高中数学重点知识归纳
  10. 清华贫困生的树洞,没有卖惨与诉苦,那股韧劲直抵人心