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;
}
총결산이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.