Climate change
Climate change
#include <iostream>
#include <vector>
#include <png.h>
void convertToGrayscale(const std::string& inputFileName, const std::string& outputFileName) {
FILE* inputFile = fopen(inputFileName.c_str(), "rb");
if (!inputFile) {
std::cerr << "Error opening input image file." << std::endl;
return;
}
png_structp pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (!pngPtr) {
std::cerr << "Error creating PNG read structure." << std::endl;
fclose(inputFile);
return;
}
png_infop infoPtr = png_create_info_struct(pngPtr);
if (!infoPtr) {
std::cerr << "Error creating PNG info structure." << std::endl;
png_destroy_read_struct(&pngPtr, nullptr, nullptr);
fclose(inputFile);
return;
}
png_init_io(pngPtr, inputFile);
png_read_info(pngPtr, infoPtr);
int width = png_get_image_width(pngPtr, infoPtr);
int height = png_get_image_height(pngPtr, infoPtr);
int bitDepth = png_get_bit_depth(pngPtr, infoPtr);
int colorType = png_get_color_type(pngPtr, infoPtr);
if (bitDepth != 8 || colorType != PNG_COLOR_TYPE_RGB) {
std::cerr << "Unsupported image format. Only 8-bit RGB images are supported." << std::endl;
png_destroy_read_struct(&pngPtr, &infoPtr, nullptr);
fclose(inputFile);
return;
}
std::vector<unsigned char> imageData(width * height * 3);
std::vector<std::vector<unsigned char> > inputImage(height, std::vector<unsigned char>(width * 3));
for (int i = 0; i < height; ++i) {
png_read_row(pngPtr, reinterpret_cast<png_bytep>(inputImage[i].data()), nullptr);
}
fclose(inputFile);
png_destroy_read_struct(&pngPtr, &infoPtr, nullptr);
// Convert to grayscale
std::vector<std::vector<unsigned char> > outputImage(height, std::vector<unsigned char>(width));
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
// Simple grayscale conversion formula: (R + G + B) / 3
outputImage[i][j] = (inputImage[i][j * 3] + inputImage[i][j * 3 + 1] + inputImage[i][j * 3 + 2]) / 3;
}
}
// Write output image
FILE* outputFile = fopen(outputFileName.c_str(), "wb");
if (!outputFile) {
std::cerr << "Error opening output image file." << std::endl;
return;
}
pngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (!pngPtr) {
std::cerr << "Error creating PNG write structure." << std::endl;
fclose(outputFile);
return;
}
infoPtr = png_create_info_struct(pngPtr);
if (!infoPtr) {
std::cerr << "Error creating PNG info structure." << std::endl;
png_destroy_write_struct(&pngPtr, nullptr);
fclose(outputFile);
return;
}
png_init_io(pngPtr, outputFile);
png_set_IHDR(pngPtr, infoPtr, width, height, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_write_info(pngPtr, infoPtr);
for (int i = 0; i < height; ++i) {
png_write_row(pngPtr, reinterpret_cast<png_bytep>(outputImage[i].data()));
}
png_write_end(pngPtr, nullptr);
png_destroy_write_struct(&pngPtr, &infoPtr);
fclose(outputFile);
std::cout << "Image processing complete. Grayscale image saved to " << outputFileName << std::endl;
}
int main() {
std::string inputFileName = "input.png";
std::string outputFileName = "output_grayscale.png";
convertToGrayscale(inputFileName, outputFileName);
return 0;
}