top of page

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等常見格式,無需大型圖形庫即可實現基本圖像處理。

 
 
 

最新文章

查看全部
太子基隆街1號UPPER PRINCE

項目類別 詳細資料 發展商 樂風集團 (LOFTER GROUP) 所在地點 九龍旺角太子基隆街1號 物業類型 單幢式住宅大廈 單位總數 139伙 單位間隔 & 面積 開放式至三房 · 實用面積 192平方呎 至 487平方呎 特色單位 13伙...

 
 
 
藥倍安心系統介紹與爭議分析

以下是關於「藥倍安心」(MediSafe)系統的詳細介紹: **藥倍安心(MediSafe)** 是一款以人工智能驅動的網頁應用程式,由香港聖保羅男女中學中四學生潘浠淳(Clarisse Poon)開發。該系統旨在通過交叉核對醫生處方和病人病歷資料,提高處方準確性和用藥安全...

 
 
 

留言


© 2023 by Alice Barley. Proudly created with Wix.com

bottom of page