C语言修改图像颜色方法
- ctfm214
- 7月23日
- 讀畢需時 3 分鐘
在C語言中,改變圖像顏色需要讀取圖像像素數據,修改RGB值後再保存。以下是使用輕量級庫**stb_image**和**stb_image_write**的完整實現:
### 步驟說明
1. 使用`stb_image.h`讀取圖像
2. 修改每個像素的RGB值
3. 使用`stb_image_write.h`保存新圖像
### 代碼示例
```c
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image.h"
#include "stb_image_write.h"
#include <stdio.h>
#include <stdlib.h>
// 顏色轉換函數示例:增加紅色通道強度
void enhance_red(unsigned char *img, int width, int height, int channels) {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int idx = (y * width + x) * channels;
// 增強紅色通道 (最大值限制在255)
img[idx] = (img[idx] + 50) > 255 ? 255 : img[idx] + 50;
}
}
}
// 轉換為灰度圖
void convert_to_grayscale(unsigned char *img, int width, int height, int channels) {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int idx = (y * width + x) * channels;
// 灰度公式: 0.299R + 0.587G + 0.114B
unsigned char gray = (unsigned char)(
0.299f * img[idx] +
0.587f * img[idx + 1] +
0.114f * img[idx + 2]
);
for (int c = 0; c < 3; c++) { // 所有顏色通道設為相同灰度值
img[idx + c] = gray;
}
}
}
}
int main() {
int width, height, channels;
const char *input_path = "input.jpg";
const char *output_path = "output.jpg";
// 讀取圖像 (自動轉換為RGB)
unsigned char *img = stbi_load(input_path, &width, &height, &channels, 3);
if (!img) {
fprintf(stderr, "Error loading image\n");
return 1;
}
printf("Loaded: %dx%d with %d channels\n", width, height, channels);
// 選擇顏色轉換操作 (取消註釋需要的功能)
// enhance_red(img, width, height, 3); // 增強紅色
convert_to_grayscale(img, width, height, 3); // 轉灰度
// 保存為JPG (質量100%)
if (!stbi_write_jpg(output_path, width, height, 3, img, 100)) {
fprintf(stderr, "Error saving image\n");
} else {
printf("Saved: %s\n", output_path);
}
stbi_image_free(img);
return 0;
}
```
### 編譯與運行
1. **下載庫文件**:
- [stb_image.h](https://raw.githubusercontent.com/nothings/stb/master/stb_image.h)
- [stb_image_write.h](https://raw.githubusercontent.com/nothings/stb/master/stb_image_write.h)
2. **編譯命令** (Linux/macOS):
```bash
gcc -o color_editor color_editor.c -lm
```
3. **運行**:
```bash
./color_editor
```
---
### 其他顏色操作示例
```c
// 反轉顏色
void invert_colors(unsigned char *img, int width, int height, int channels) {
for (int i = 0; i < width * height * channels; i++) {
img[i] = 255 - img[i];
}
}
// 調整色調 (示例:偏藍)
void blue_tint(unsigned char *img, int width, int height, int channels) {
for (int i = 0; i < width * height * channels; i += channels) {
img[i + 2] = (img[i + 2] + 100) > 255 ? 255 : img[i + 2] + 100; // 增強藍色
}
}
```
---
### 關鍵點說明
1. **像素結構**:
- RGB圖像:連續存儲 `[R,G,B, R,G,B, ...]`
- RGBA圖像:`[R,G,B,A, ...]`
2. **顏色操作**:
- 修改單個通道(如 `img[idx]` = 紅色)
- 數學運算(加法/乘法調整亮度/對比度)
- 通道混合(如灰度轉換)
3. **注意事項**:
- 像素值範圍:0-255(需防止溢出)
- 通道數處理:支持RGB(3)或RGBA(4)
- 內存管理:`stbi_load()`分配內存需用`stbi_image_free()`釋放
此方法適用於JPEG/PNG/BMP等常見格式,無需大型圖形庫即可實現基本圖像處理。

留言