Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用fwrite()写入的图像不完整_C++_Image Processing - Fatal编程技术网

C++ 使用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

我正在编写一个代码来读取和写入图像文件,但我的代码工作正常,只是在使用fwrite()时只写入了图像的四分之一……请帮助我找出我的错误。提前感谢。 我是这个领域的新手

这是我的读写函数代码。 请忽略我为完成工作而编写的任何愚蠢的代码

#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标准是否允许它们。