C++ 使用fwrite()写入的图像不完整
我正在编写一个代码来读取和写入图像文件,但我的代码工作正常,只是在使用fwrite()时只写入了图像的四分之一……请帮助我找出我的错误。提前感谢。 我是这个领域的新手 这是我的读写函数代码。 请忽略我为完成工作而编写的任何愚蠢的代码C++ 使用fwrite()写入的图像不完整,c++,image-processing,C++,Image Processing,我正在编写一个代码来读取和写入图像文件,但我的代码工作正常,只是在使用fwrite()时只写入了图像的四分之一……请帮助我找出我的错误。提前感谢。 我是这个领域的新手 这是我的读写函数代码。 请忽略我为完成工作而编写的任何愚蠢的代码 #include<iostream> #include <cstdlib> #include <cstdio> #define FALSE 0 #define TRUE 1 int c,numberOfCols,numberOfR
#include<iostream>
#include <cstdlib>
#include <cstdio>
#define FALSE 0
#define TRUE 1
int c,numberOfCols,numberOfRows,HighVal,totalPx,header;
int** a;
int doneReading = FALSE;
char * string;
unsigned char * image;
//Read Image
int readImage(char **argv){
FILE * pFile;
pFile = fopen (argv[1],"rt");
if (pFile==NULL) perror ("Error opening file");
else {
string = (char *)calloc(256,1);
while (!(doneReading) && !feof (pFile)) {
c=(char)getc (pFile);
switch(c){
case 'P':
c=(char)getc (pFile);
switch(c){
case '1':
header=1;
std::cout<<".pbm white n black";
break;
case '2':
header=2;
std::cout<<".pgm greyscale";
break;
case '3':
header=3;
std::cout<<".ppm rgb";
break;
}
c=(char)getc (pFile);
if(c==0x0A) ungetc(c,pFile) ;
break;
case '#':
fgets(string,256,pFile);
std::cout<<"File you entered is "<<string<<"\n";
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ungetc(c,pFile);
fscanf(pFile,"%d %d %d",&(numberOfCols),&(numberOfRows),&(HighVal));
doneReading=TRUE;
std::cout<<"Done";
std::cout<<"\nNo. of columns: "<<numberOfCols<<"\nNo. of Columns: "<<numberOfRows<<"\nMaximum Intensity: "<<HighVal<<"\n";
break;
}
totalPx=numberOfCols*numberOfRows*1;
image=(unsigned char *)malloc(totalPx);
fread(image,1,totalPx,pFile);
}
std::cout<<"Image read from "<<argv[1]<<"...\n";
}
return totalPx;
}
//Write Image
void writeImage(char **argv,int pixels){
FILE *fOut;
fOut=fopen(argv[2],"wt");
if (fOut==NULL) perror ("Error opening file");
else {
fprintf(fOut,"P%d \n%d %d \n%d",header,numberOfCols,numberOfRows,HighVal);
fwrite(image,1,pixels,fOut);
std::cout<<"Image Written on "<<argv[2]<<"...";
}
}
int main (int argc,char **argv)
{
int pixels;
pixels = readImage(argv);
writeImage(argv,pixels);
return 0;
}
#包括
#包括
#包括
#定义FALSE 0
#定义真1
int c,numberOfCols,numberOfRows,HighVal,totalPx,header;
国际**a;
int donerereading=FALSE;
字符*字符串;
无符号字符*图像;
//读取图像
int readImage(字符**argv){
文件*pFile;
pFile=fopen(argv[1],“rt”);
如果(pFile==NULL)perror(“打开文件时出错”);
否则{
字符串=(char*)calloc(256,1);
而(!(doneReading)和&!feof(pFile)){
c=(char)getc(pFile);
开关(c){
案例“P”:
c=(char)getc(pFile);
开关(c){
案例“1”:
标题=1;
std::cout您的问题似乎与从readImage()
返回的值有关。它返回的是像素数,而不考虑像素的大小。此行:
totalPx=numberOfCols*numberOfRows*1;
返回像素数,但像素可以是1、2、4或更多字节。假设图像数据是RGBA,则需要在调用writeImage()
或fwrite()时将其乘以4
我看不到任何代码。请避免发布带有图片的代码。您应该在问题中以文本形式发布代码,而不是以图像形式发布代码。此外,请将其减少为。如果您发布重现问题所需的最短程序,人们将能够更好地帮助您。可能重复的代码,请不要忘记检查返回值。malloc()可以返回NULL。您缺少格式4、5和6,即1、2和3的二进制版本。我认为注释长度可能超过256个字符。您是否考虑过其中包含\r的文件?不确定ppm标准是否允许它们。