Неполное изображение записывается с использованием fwrite () - PullRequest
0 голосов
/ 07 июня 2018

Я писал код для чтения и записи файла изображения, но мой код работает нормально, за исключением того, что только одна четвертая часть изображения написана при использовании fwrite () ... Пожалуйста, помогите мне узнать, где я ошибся.Заранее спасибо.PS Я новичок в этой области.

Это мой код для функций чтения и записи.Пожалуйста, не обращайте внимания на любые глупости, которые я, возможно, закодировал, чтобы выполнить работу.

#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;
}

1 Ответ

0 голосов
/ 07 июня 2018

Похоже, ваша проблема со значением, возвращенным из readImage().Он возвращает количество пикселей без учета размера пикселя.Эта строка:

totalPx=numberOfCols*numberOfRows*1;

возвращает количество пикселей, но размер пикселя может составлять 1, 2, 4 или более байтов.Предполагая, что ваши данные изображения RGBA, вам нужно умножить это на 4 при вызове либо writeImage() или fwrite().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...