ChatGPT said:
Here’s a high-performance C++ program using OpenCV and C++17 that:
-
Accepts a folder path as input.
-
Iterates all image files in that folder (
.jpg
,.jpeg
,.png
, etc.). -
Moves the original to a subfolder
original/
(creating if not exists). -
Compresses/resizes each image to reduce size.
-
Saves the reduced image with same filename in original location.
✅ Requirements
Install OpenCV:
bashsudo apt install libopencv-dev
Compile with:
bashg++ -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.
- Get link
- X
- Other Apps
- Get link
- X
- Other Apps
Comments
Post a Comment
If you have any doubts, please let me know.