2015-09-09 2 views
1
#include <iostream> 
#include <fstream> // for file I/O 
#define WIDTH 128 
#define HEIGHT 128 
#include <cmath> 

using namespace std; 
typedef unsigned char unchar; 

class MImage 
{ 

///////////////////////////////////////////////////////////////////////////////////////read 

public: 
    void readimage() 
    { 

     imageData = new unchar*[HEIGHT]; // create new array size: height of image. 

     for (int i = 0; i < HEIGHT; i++) 
     { 
      imageData[i] = new unchar[WIDTH]; //create matrix.   
     } 

     //image I/O 
     pInFile = new ifstream; 
     pInFile->open("L.bmp", ios::in | ios::binary); // open fileName and read as binary. 

     pInFile->read(reinterpret_cast<char*>(imageHeaderData), 1078); //read bmp header data into array. 

     for (int i = 0; i < HEIGHT; i++) 
     { 
      pInFile->read(reinterpret_cast<char*>(imageData[i]), WIDTH); //read row into each array entry. 
     } 

     pInFile->close(); //close stream. 
    } 

public: 
    void write() 
    { 

     //smoothFilter(); 
     pOutFile = new ofstream; 
     pOutFile->open("output.bmp", ios::out | ios::binary); 
     pOutFile->write(reinterpret_cast<char*>(imageHeaderData), 1078); //write header data onto output 

     for (int i = 0; i < HEIGHT; i++) 
     { 

      pOutFile->write(reinterpret_cast<char*>(imageData[i]), WIDTH); // write new image data. 

     } 

     pOutFile->close(); //close stream 
    } 

public: 
    ifstream* pInFile; 
    ofstream* pOutFile; 
    unchar imageHeaderData[1078]; //.bmp header data with offset 1078. unchar** imageData; 

}; 
int main() 
{ 

    MImage abc; 
    abc.readimage(); 
    abc.write(); 

    return 0; 
}  

Я не могу прочитать изображение в массиве 2d, чтобы я мог обработать его. Я использовал код выше, но сохраненный файл дает ошибку. то, что я делаю, вначале читает .bmp-файл 128x128, а затем сохраняет его в другом .bmp-файле. но когда я пытаюсь открыть выходной файл, он дает ошибку «файл поврежден или большой по размеру»читать изображение в 2d массиве C++ и сохранять его

+0

Этого код сделал мой форматтер метать. Я должен был исправить это вручную. Кром, чувак, что ты написал с этим? – user4581301

+0

Не используйте макросы, зачем вам только когда-либо поддерживать 128x128 изображений? Используйте векторы, чтобы вы не просачивали память, и вы можете скопировать свой класс, не нарушая его. Почему члены класса filestreams? Вы используете их только внутри функции, и их не следует динамически распределять. –

+0

Нет файлов для проверки наличия файла 128x128. Содержимое заголовка полностью игнорируется, поэтому вы не знаете, как кодируются данные изображения. – user4581301

ответ

1

Надеюсь, что это поможет;) Я пропустил проверку ошибок, но вы должны добавить его в конечный код. Для написания .bmp изображений, wirte BITMAPFILEHEADER первого, затем BITMAPINFOHEADER и в конце фактических исходных данных

FILE* filePtr; 
int error; 
unsigned int count; 
BITMAPFILEHEADER bitmapFileHeader; 
BITMAPINFOHEADER bitmapInfoHeader; 
int imageSize; 
unsigned char* bitmapImage; 

// Open the height map file in binary. 
error = fopen_s(&filePtr, filename, "rb"); 

// Read in the file header. 
count = fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr); 

// Read in the bitmap info header. 
count = fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr); 

// Save the dimensions of the terrain. 
Width= bitmapInfoHeader.biWidth; 
Height= bitmapInfoHeader.biHeight; 

// Calculate the size of the bitmap image data. 
imageSize = Width* Height* 3; 

// Allocate memory for the bitmap image data. 
bitmapImage = new unsigned char[imageSize]; 

// Move to the beginning of the bitmap data. 
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET); 

// Read in the bitmap image data. 
count = fread(bitmapImage, 1, imageSize, filePtr); 

// Close the file. 
error = fclose(filePtr); 

Не забудьте удалить bitmapImage или использовать std::vector вместо