Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "File.h"
- #include <string>
- #include <fstream>
- #include <iostream>
- // constructor
- File::File(std::string fileName) {
- header = {};
- pixelArray = nullptr;
- if (!ReadFile(fileName)) {
- // file not read properly, explain error
- std::cout << "File read incorrectly." << std::endl;
- }
- }
- // destructor
- File::~File() {
- // Free dynamically allocated memory for pixelArray
- if (pixelArray != nullptr) {
- for (int i = 0; i < header.height; ++i) {
- delete[] pixelArray[i];
- }
- delete[] pixelArray;
- }
- }
- // read file
- bool File::ReadFile(std::string fileName) {
- // open file
- std::ifstream file(fileName, std::ios::binary);
- if (!file.is_open()) {
- std::cout << "Failed to open target file." << std::endl;
- return false;
- }
- // read header from file
- header = readHeader(file);
- // read pixels into pixel array
- pixelArray = readPixelArray(file, header.width, header.height);
- // close file
- file.close();
- return true;
- }
- // write file
- bool File::WriteFile(std::string fileName) {
- // open file
- std::ofstream file(fileName, std::ios::binary);
- if (!file.is_open()) {
- std::cout << "Failed to open target file." << std::endl;
- return false;
- }
- // write header to file
- writeHeader(header, file);
- // write pixel array to file
- writePixelArray(pixelArray, file);
- if (pixelArray == nullptr) {
- return false;
- }
- // close file
- file.close();
- return true;
- }
- // read header
- File::Header File::readHeader(std::ifstream& file) {
- Header header;
- // Read each component of the header
- file.read(reinterpret_cast<char*>(&header.idLength), sizeof(char));
- file.read(reinterpret_cast<char*>(&header.colorMapType), sizeof(char));
- file.read(reinterpret_cast<char*>(&header.dataTypeCode), sizeof(char));
- file.read(reinterpret_cast<char*>(&header.colorMapOrigin), sizeof(short));
- file.read(reinterpret_cast<char*>(&header.colorMapLength), sizeof(short));
- file.read(reinterpret_cast<char*>(&header.colorMapDepth), sizeof(char));
- file.read(reinterpret_cast<char*>(&header.xOrigin), sizeof(short));
- file.read(reinterpret_cast<char*>(&header.yOrigin), sizeof(short));
- file.read(reinterpret_cast<char*>(&header.width), sizeof(short));
- file.read(reinterpret_cast<char*>(&header.height), sizeof(short));
- file.read(reinterpret_cast<char*>(&header.bitsPerPixel), sizeof(char));
- file.read(reinterpret_cast<char*>(&header.imageDescriptor), sizeof(char));
- return header;
- }
- // write header to file
- void File::writeHeader(Header header, std::ofstream& file) {
- // write each component of the header
- file.write(reinterpret_cast<char*>(&header.idLength), sizeof(char));
- file.write(reinterpret_cast<char*>(&header.colorMapType), sizeof(char));
- file.write(reinterpret_cast<char*>(&header.dataTypeCode), sizeof(char));
- file.write(reinterpret_cast<char*>(&header.colorMapOrigin), sizeof(short));
- file.write(reinterpret_cast<char*>(&header.colorMapLength), sizeof(short));
- file.write(reinterpret_cast<char*>(&header.colorMapDepth), sizeof(char));
- file.write(reinterpret_cast<char*>(&header.xOrigin), sizeof(short));
- file.write(reinterpret_cast<char*>(&header.yOrigin), sizeof(short));
- file.write(reinterpret_cast<char*>(&header.width), sizeof(short));
- file.write(reinterpret_cast<char*>(&header.height), sizeof(short));
- file.write(reinterpret_cast<char*>(&header.bitsPerPixel), sizeof(char));
- file.write(reinterpret_cast<char*>(&header.imageDescriptor), sizeof(char));
- }
- File::Pixel** File::readPixelArray(std::ifstream& file, int width, int height) {
- // create 2D array of pixels
- Pixel** pixelArray = new Pixel*[width];
- // read pixels row as many pixels of w/h
- for (int i = 0; i < width; ++i) {
- pixelArray[i] = new Pixel[height];
- file.read(reinterpret_cast<char*>(pixelArray[i]), sizeof(Pixel) * height);
- }
- return pixelArray;
- }
- void File::writePixelArray(Pixel** pixelArray, std::ofstream& file) {
- for (int i = 0; i < header.height; ++i) {
- file.write(reinterpret_cast<char*>(pixelArray[i]), sizeof(Pixel) * header.width);
- }
- }
- File::Header File::getHeader() {
- return header;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement