Write program in C/cpp to reduce image disk size (chatGpt discussions)

Write a program in cpp/c that will take Unix folder path as input Then search for each ing in that folder Reduce img disk size and put original img in folder original inside that input folder, save reduced img with same name in that folder
ChatGPT said:

Here’s a high-performance C++ program using OpenCV and C++17 that:

  1. Accepts a folder path as input.

  2. Iterates all image files in that folder (.jpg, .jpeg, .png, etc.).

  3. Moves the original to a subfolder original/ (creating if not exists).

  4. Compresses/resizes each image to reduce size.

  5. Saves the reduced image with same filename in original location.


Requirements

Install OpenCV:

bash
sudo apt install libopencv-dev

Compile with:

bash
g++ -std=c++17 -O2 img_reduce.cpp -o img_reduce `pkg-config --cflags --libs opencv4`

Code: img_reduce.cpp

cpp
#include <iostream> #include <filesystem> #include <opencv2/opencv.hpp> namespace fs = std::filesystem; bool is_image(const fs::path& path) { std::string ext = path.extension().string(); for (auto& c : ext) c = std::tolower(c); return ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp"; } void reduce_image_size(const fs::path& img_path, const fs::path& original_dir) { try { cv::Mat img = cv::imread(img_path.string(), cv::IMREAD_UNCHANGED); if (img.empty()) { std::cerr << "Failed to read image: " << img_path << "\n"; return; } // Save original in 'original' folder fs::path orig_path = original_dir / img_path.filename(); fs::rename(img_path, orig_path); // Resize/compress image (resize to 70% and re-encode) cv::Mat reduced_img; cv::resize(img, reduced_img, cv::Size(), 0.7, 0.7, cv::INTER_AREA); std::vector<int> compression_params; if (img_path.extension() == ".jpg" || img_path.extension() == ".jpeg") { compression_params.push_back(cv::IMWRITE_JPEG_QUALITY); compression_params.push_back(70); // quality 0-100 } else if (img_path.extension() == ".png") { compression_params.push_back(cv::IMWRITE_PNG_COMPRESSION); compression_params.push_back(3); // 0-9 (lower = better quality) } cv::imwrite(img_path.string(), reduced_img, compression_params); std::cout << "Processed: " << img_path.filename() << "\n"; } catch (const std::exception& e) { std::cerr << "Error processing " << img_path << ": " << e.what() << "\n"; } } int main() { std::string folder_path; std::cout << "Enter folder path: "; std::getline(std::cin, folder_path); fs::path input_dir(folder_path); if (!fs::exists(input_dir) || !fs::is_directory(input_dir)) { std::cerr << "Invalid folder path.\n"; return 1; } fs::path original_dir = input_dir / "original"; fs::create_directory(original_dir); for (auto& entry : fs::directory_iterator(input_dir)) { if (fs::is_regular_file(entry.path()) && is_image(entry.path())) { reduce_image_size(entry.path(), original_dir); } } std::cout << "Image processing complete.\n"; return 0; }

🧪 Example

Suppose your folder is:

swift
/home/user/images/

You run:

bash
./img_reduce Enter folder path: /home/user/images

It will:

  • Move /home/user/images/pic1.jpg/home/user/images/original/pic1.jpg

  • Create reduced /home/user/images/pic1.jpg


✅ Output

  • Reduced size image with same filename in original folder.

  • Original image preserved inside original/.


Let me know if you want a pure C version (more complex due to lack of high-level image handling) or integration into a REST API or GUI.

No comments:

Post a Comment

If you have any doubts, please let me know.

Various types of salts effect on health (discussion with gemenie)

Is  rock salt or bitnoon helps in digestion or just a airuvedic nuska This is for informational purposes only. For medical advice or diagnos...