C/C++를 이용 하여 png 파일 을 읽 고 쓰 는 방법 예시

머리말
바 이 너 리 파일 은 ASCII 코드 로 데 이 터 를 저장 하 는 것 이 아니 라 메모리 에 있 는 데이터 저장 형식 을 디스크 파일 로 변환 하지 않 고 전송 하기 때문에 메모리 데이터 의 이미지 파일 이 라 고도 부른다.파일 의 정 보 는 문자 데이터 가 아니 라 바이트 의 바 이 너 리 형식의 정보 이기 때문에 바이트 파일 이 라 고도 부른다.
바 이 너 리 파일 에 대한 작업 도 먼저 파일 을 열 고 다 쓴 후에 파일 을 닫 아야 합 니 다.열 때 ios:binary 를 바 이 너 리 형식 으로 전송 하고 저장 해 야 합 니 다.바 이 너 리 파일 은 입력 파일 이나 출력 파일 외 에 도 입력 할 수 있 고 출력 할 수 있 는 파일 일 수 있 습 니 다.ASCII 파일 과 다른 점 입 니 다.
수요
최근 OpenGl 의 텍 스 처 코드 를 만 들 기 위해 책 에 픽 셀 을 가 져 오지 않 은 것 을 발견 하고 png 를 가 져 오 려 고 했 는데 하루 가 걸 렸 습 니 다.왜 데이터 가 개별적 으로 정확 한 지 알 지 못 했 습 니 다.다른 것 은 205 입 니 다.

예전 에 부 드 러 운 일 을 했 을 때 그 사 이 트 는 로그 인 과 텍스트 표시 만 완 료 했 지만 데이터베이스 에 그림 을 저장 할 때 1 개의 그림 주소,2 개의 그림 바 이 너 리 데 이 터 를 알 고 싶 었 다.
그래,2 진법 이 야.그리고 C++를 들 고 뒤 져 서 찾 아 보 세 요.ifstream iOS:binary 의 성공 적 인 데 이 터 는 정상 입 니 다.
하루 만 에 r 와 rb 가 다른 것 같 아 요.맞 아,그 지식 들 은 확실히 기억 하지 못 했 어.그리고 C 도 OK 로 바 꿨 어 요.
아래 코드 는 가장 간단 한 읽 기와 쓰기 만 있 습 니 다.주소 포 지 셔 닝 같은 거,개별 주석 에 있어 요.png 의 형식 을 바 꾸 려 면 png 의 데이터 구 조 를 다시 알 아야 합 니 다.
10 진법 을 원한 다 면 주석 을 따라 고 쳐 라.
mm.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; 
} 
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기