簡體   English   中英

C 改RBG值好像不行

[英]Changing RBG value doesn't seem to work in C

我應該通過獲取 3 的平均值然后將該平均值分配給每種 RBG 顏色(紅色、藍色、綠色)來將 RGB 顏色更改為灰色,但它不起作用。

首先,我將發布我的灰度部分代碼:

#include "helpers.h"

// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
   for(int i = 0; i < height; i++)
   {
     for(int j = 0; j < width; j++)
     {
       RGBTRIPLE rgbt = image[i][j];
       BYTE average = (rgbt.rgbtBlue/3)+(rgbt.rgbtGreen/3)+(rgbt.rgbtRed);
       *rgbt.rgbtBlue = *average;
       *rgbt.rgbtGreen = *average;
       *rgbt.rgbtRed = *average;
     }        
   }
   return;
}

由於它很重要,這里提到了 RGBT 值:(在另一個文件中,在 helpers.h 的 header 中提到,稱為 bmp.h):

/**
 * RGBTRIPLE
 *
 * This structure describes a color consisting of relative intensities of
 * red, green, and blue.
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/aa922590.aspx.
 */
 typedef struct
 {
   BYTE  rgbtBlue;
   BYTE  rgbtGreen;
   BYTE  rgbtRed;
 } __attribute__((__packed__))
 RGBTRIPLE;

錯誤信息如下:

間接需要指針操作數(“int”無效)

感謝您的幫助(我知道 cs50 不是最好的課程,但哈佛文憑會有所幫助。)。

我想你想要這個:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
   for(int i = 0; i < height; i++)
   {
     for(int j = 0; j < width; j++)
     {
       RGBTRIPLE rgbt = image[i][j];
       BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
       rgbt.rgbtBlue = average;
       rgbt.rgbtGreen = average;
       rgbt.rgbtRed =  average;
       image[i][j] = rgbt;   
     }        
   }
   return;
}

提示:您可以通過刪除rgbt變量來簡單地解決這個問題。 您只需要在內層 for 循環中的一行代碼。

原始代碼中的問題:

這是錯誤的:

BYTE average = (rgbt.rgbtBlue/3)+(rgbt.rgbtGreen/3)+(rgbt.rgbtRed);

因為您沒有將rgbt.rgbtRed除以 3,無論如何您應該先將所有值相加,然后將整個值除以 3,這樣可以防止舍入錯誤:

BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;

這是錯誤的,您使用*取消引用不是指針的內容:

 *rgbt.rgbtBlue = *average;

你只是想要:

 rgbt.rgbtBlue = average;

最后但同樣重要的是,您仍然需要通過添加以下內容來修改圖像中的原始值:

 image[i][j] = rgbt;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM