亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

利用C/C++二進制讀寫png文件的方法示例

2020-05-23 13:54:56
字體:
來源:轉載
供稿:網友

前言

二進制文件不是以ASCII代碼存放數據的,它將內存中數據存儲形式不加轉換地傳送到磁盤文件,因此它又稱為內存數據的映像文件。因為文件中的信息不是字符數據,而是字節中的二進制形式的信息,因此它又稱為字節文件。

對二進制文件的操作也需要先打開文件,用完后要關閉文件。在打開時要用ios::binary指定為以二進制形式傳送和存儲。二進制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。這是和ASCII文件不同的地方。

需求

最近為了弄OpenGl的紋理代碼,發現書上沒有圖片像素的獲取,然后就想寫個來獲取png的,結果花了一天的時間沒弄清楚為什么出現數據個別正確其他的卻是205

c,二進制文件讀寫,c語言二進制文件讀寫,png文件讀寫

突然想起來以前弄軟工的時候雖然那個網站只完成了登入注冊和文本顯示,但是想在數據庫中存儲圖片的時候了解到1存圖片地址,2存圖片二進制數據。

沒錯就是二進制。然后拿起C++的翻開找啊找,弄了個ifstream iOS::binary的,成功數據正常。
時隔一天才又想起來r和rb好像是有區別的。沒錯,那些知識確實沒有記住。然后就把C的也改ok了

以下代碼只有最簡單的讀寫。地址定位啥的,個別注釋中有。如果要改動png的格式甚么的就要再了解一下png的數據結構
如果要十進制的話就跟著注釋改一下

mm.png

c,二進制文件讀寫,c語言二進制文件讀寫,png文件讀寫

實例代碼如下

#include<iostream> #include<fstream> using namespace std; typedef unsigned char byte;  /* class PngMsg { private :  unsigned char markMsg[8]; //十進制,相當于16進制89.50.4e.47.0d.0a.1a.0a;  char widthloc;  char heigtMsgloc;  char BitDepthloc;//圖像深度  char ColorTypeloc;  char CompressionMethodloc;//壓縮方法(LZ77派生算法)  char FilterMethodloc;//濾波器方法  char InterlaceMethodloc; public:  PngMsg()  {  markMsg[0] = 137;markMsg[1] = 80; markMsg[2] = 78;markMsg[3] = 71; markMsg[4] = 13;markMsg[5] = 10; markMsg[6] = 26; markMsg[7] = 10;  widthloc = 'a';  heigtMsgloc = 'b';  BitDepthloc = 'c';//圖像深度  ColorTypeloc = 'd';  CompressionMethodloc = 'e';//壓縮方法(LZ77派生算法)  FilterMethodloc = 'f';//濾波器方法  InterlaceMethodloc = 'g';  }  long int getMsg(char loc)  {  if (loc == 'a')return 0x10;  if (loc == 'b')return 0x14;  if (loc == 'c')return 0x15;  if (loc == 'd')return 0x16;  if (loc == 'e')return 0x17;  if (loc == 'f')return 0x18;  if (loc == 'g')return 0x19;  }  unsigned char width[4];//圖像寬度,單位像素  unsigned char height[4];//圖像高度,單位像素  unsigned char BitDepth;  //圖像深度  //索引彩色1.2.4.8;灰度1.2.4.8.16;真彩色8.16  unsigned char ColorType;  //0灰度1.2.4.8.16;2真彩色8.16;3索引彩色1.2.4.8  //4帶α通道數據的灰度8.16;6帶α通道數據的真彩色8.16  unsigned char CompressionMethod;//壓縮方法(LZ77派生算法)  unsigned char FilterMethod;//濾波器方法  unsigned char InterlaceMethod;//0:非隔行掃描;1:Adam7 };*/   //===============================   //=============== //二進制讀入。書上寫ASCII碼讀取和二進制讀取,如果對象是字母,那么一致。如果是數字,那么不一致 //書中說明【文件中數據的組織形式,分為ASCII文件(一個字節存放一個ASCII代碼)和二進制文件(內部文件,存儲形式原樣在磁盤上存放),】 //字符,內存存儲=ASCII=二進制形式 //數值數據,內存存儲和ASCII碼不同。 //樣例內存整數100000. //---------------------------------------------------------------- //內存地址 0x00 01 02 03 //內存 00000000 00000000 00100111 00010000【大端模式下】 //---------------------------------------------------------------- //二進制 00000000 00000000 00100111 00010000 //---------------------------------------------------------------- //ASCII 00110001 00110000 00110000 00110000 00110000 00110000【6個字節】 //ASCII碼對應 1的49 0的48 0的48 0的48 0的48 0的48 //----------------------------------------------------------------    //只有含‘寫'的不存在的文件會新建,其他會報錯  //r只讀;w只寫;a尾增(附加/寫);文本ASCII //rb讀;wb寫;ab尾增;二進制 //以下讀寫↓ //r+;w+;a+;文本ASCII //rb+;wb+;ab+二進制 void writeImage(byte*imgbuf, int size) {  //FILE* fp = fopen(shaderFile, "wb");  //由于vs甚么安全性的原因,不讓使用fopen,用下面的fopen_s代替;  FILE*imgPo;  fopen_s(&imgPo, "mag.png", "wb");//這里是用二進制讀取,read-r;binary-b;因為只弄r結果出錯!!弄了后面那個的再來看這個才發現是這個的問題??!  if (imgPo == NULL)return;  fwrite(imgbuf, sizeof(char),size,imgPo);  fclose(imgPo); } void readImageFile(const char* Imgname) {  //FILE* fp = fopen(shaderFile, "rb");  //由于vs甚么安全性的原因,不讓使用fopen,用下面的fopen_s代替;  FILE*imgP;  fopen_s(&imgP,Imgname,"rb");//這里是用二進制讀取,read-r;binary-b;因為只弄r結果出錯!!弄了后面那個的再來看這個才發現是這個的問題!!  if (imgP == NULL)return ;  fseek(imgP, 0L, SEEK_END);  long size = ftell(imgP);  byte*imgbuf = new byte[size+ 1];  fseek(imgP,0x0L,SEEK_SET);//圖片源  fread(imgbuf, sizeof(imgbuf[0]), size, imgP);  /*for (int j = 0; j < size; j++)  cout << (imgbuf[j] & 0xff) << ":";*/  fclose(imgP);   writeImage(imgbuf, size); }   //===========================================================   void WriteImage(byte*imgbuf, int size) {   ofstream imgFo("Image2.png", ios::binary);  if (!imgFo)  {  cerr << "open error!" << endl;  abort();  }  imgFo.write((char*)imgbuf, size);//一次性寫入后面注釋的是循環寫入   /* for (int i = 0; i < size; i++)  {  char ct = (imgbuf[i] & 0xFF);  imgFo.write(&ct, sizeof(char));   //byte ct = (imgbuf[i] & 0xFF);  //imgFo.write((char*)&ct, sizeof(byte));  //嘗試這樣輸出的是否正確.  //byte是我自己給名的unsigned char,出來的是對的,用char也可以。都是一個字節。   }*/  imgFo.close(); } void ReadImageFile(const char* Imgname) {  ifstream imgF(Imgname, ios::binary);  if (!imgF) {  cerr << "open error!" << endl;  abort();  }  imgF.seekg(0, ios::end);  int size = imgF.tellg();  //查了C++Library Reference才知道怎么得到size。  /*int pixscnt;  byte width[4], height[4];   imgF.seekg(0x10);  imgF.read((char*)&width, sizeof(width));   imgF.seekg(0x14);  imgF.read((char*)&height, sizeof(height));   for (int i = 0; i < 4; i++)  cout << (width[i] & 0xff) << ":";   for (int i = 0; i < 4; i++)  cout << (height[i] & 0xff) << ":";   pixscnt = (width[2] * (0x100) + width[3])*(height[2] * (0x100) + height[3]);  cout << pixscnt << endl;//像素  cout << size << endl;*/  byte*imgbuf = new byte[size];  //imgF.seekg(0x10);  imgF.seekg(0,ios::beg);  imgF.read((char*)imgbuf, size);//一次性讀入,書上的不知是錯的還是舊的不可行。后面注釋的是循環讀入  /*for (int i = 0; i<size; i++)  imgF.read( (char*)&imgbuf[i], sizeof(byte));*/  imgF.close();  /*for (int i = 0; i < size; i++)  {  cout << hex << (imgbuf[i] & 0xff) << ":";  if (i % 4 == 0)cout << endl;  } */ WriteImage(imgbuf, size); }  int main() {  readImageFile("mm.png");//C/C++的  ReadImageFile("mm.png");//C++的  system("pause");  return 0; } 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人免费在线视频| 亚洲成色777777在线观看影院| 欧美激情啊啊啊| 国产日韩欧美成人| 日韩欧美在线网址| 在线免费观看羞羞视频一区二区| 尤物九九久久国产精品的分类| 久久99久国产精品黄毛片入口| 欧美野外猛男的大粗鳮| 久久精品成人欧美大片古装| 中文字幕亚洲无线码a| 91视频国产精品| 91精品久久久久久久久久另类| 国产一区二中文字幕在线看| 午夜精品久久久久久99热| 日韩在线观看免费全| 欧美大片第1页| 日韩av免费看网站| 亚洲网站在线看| 久久久国产精品免费| 国产精品网站视频| 亚洲精品视频免费在线观看| 欧美成人午夜免费视在线看片| 国产成人精品在线观看| 成人精品视频久久久久| 亚洲乱码国产乱码精品精| 日韩av一区在线| 久久精品中文字幕免费mv| www.欧美精品一二三区| 青青久久av北条麻妃黑人| 欧美精品成人91久久久久久久| 狠狠干狠狠久久| 色综合伊人色综合网站| 国产精品视频在线观看| 亚洲成年人在线播放| 亚洲国产古装精品网站| 国产精品久久在线观看| 亚洲成人av片在线观看| 91av在线国产| 精品久久香蕉国产线看观看亚洲| 亚洲天堂网站在线观看视频| 成人国产精品一区二区| 一本色道久久综合狠狠躁篇怎么玩| 欧美性xxxx极品hd欧美风情| 亚洲最大福利网| 欧美日韩成人精品| 国产在线拍揄自揄视频不卡99| 成人免费视频网| 亚洲成人黄色在线| 中文字幕亚洲欧美一区二区三区| 亚洲欧美另类中文字幕| 欧美另类暴力丝袜| 国产女人精品视频| 日本人成精品视频在线| 久久精品国产亚洲7777| 久久精品国产欧美亚洲人人爽| 亚洲精品福利在线| 久久综合网hezyo| 欧美在线视频播放| 亚洲精品美女在线| 国色天香2019中文字幕在线观看| 91av在线视频观看| 国产精品一区二区久久| 日韩国产中文字幕| 精品国产欧美成人夜夜嗨| 在线观看久久久久久| 美女性感视频久久久| 一区二区三区亚洲| 日本高清不卡的在线| 热门国产精品亚洲第一区在线| 97国产精品视频| 最近2019年中文视频免费在线观看| 一区二区欧美在线| 国产成人精品在线视频| 国产精品私拍pans大尺度在线| 亚洲天堂成人在线| 欧美黑人狂野猛交老妇| 一区二区日韩精品| 亚洲精品久久视频| 久久久国产精彩视频美女艺术照福利| 欧美亚洲在线播放| 欧美日本精品在线| 91欧美视频网站| 欧美亚洲国产视频小说| 日韩视频精品在线| 国内外成人免费激情在线视频网站| 91精品国产乱码久久久久久久久| 中文字幕在线精品| 欧美精品一本久久男人的天堂| 亚洲美女又黄又爽在线观看| 国产精品热视频| 91在线国产电影| www国产亚洲精品久久网站| 久久国产视频网站| 97视频在线观看播放| 日韩精品有码在线观看| 不卡伊人av在线播放| 亚洲国产精品女人久久久| 岛国av一区二区三区| 亚洲字幕一区二区| 亚洲午夜久久久久久久| www.日韩系列| 亚洲三级黄色在线观看| 黑人巨大精品欧美一区免费视频| 亚洲色图日韩av| 欧美色视频日本版| 欧美高清性猛交| 国产精品一区二区三区久久| 亚洲香蕉成人av网站在线观看| 欧美第一黄网免费网站| 欧美一级黑人aaaaaaa做受| 欧美人在线视频| 日韩精品视频在线免费观看| 欧美国产在线电影| 欧美丰满片xxx777| 日韩在线观看网址| 国产成人欧美在线观看| 欧美高清一级大片| 久久在线免费观看视频| 欧美成人剧情片在线观看| 亚洲图片欧美日产| 欧美日韩国产精品一区二区三区四区| 亚洲精品久久久久中文字幕二区| 久久久av免费| 日韩成人中文字幕在线观看| 欧美一级大片在线观看| 97国产精品免费视频| 日韩精品在线电影| 精品视频—区二区三区免费| 国产精品视频色| 国产精品v日韩精品| 日韩人在线观看| 日韩欧美国产高清91| 清纯唯美亚洲综合| 国产成人精品久久亚洲高清不卡| 亚洲人成网站色ww在线| 亚洲欧美日韩国产成人| 欧美另类老女人| 日韩av影片在线观看| 国产精品99久久99久久久二8| 欧美高跟鞋交xxxxxhd| 国产精品草莓在线免费观看| 国产亚洲精品成人av久久ww| 国产精品video| 亚洲精品国产综合久久| 国产欧美久久久久久| 日韩av在线播放资源| 亚洲精品ady| 久国内精品在线| 亚洲另类xxxx| 91久久精品国产91性色| 一区二区亚洲精品国产| 国产乱肥老妇国产一区二| 福利视频导航一区| 国产深夜精品福利| 欧美激情在线狂野欧美精品| 97精品久久久中文字幕免费| 国产精品久久久久久av福利软件| 欧美成人精品不卡视频在线观看| 国产精品久久久久久久9999| 亚洲男人第一av网站| 国产精品揄拍一区二区| 国产精品对白刺激| 久久乐国产精品|