将 type int 乘以 struct 时出错
Error when multiplying type int to struct
以下代码在尝试编译时出现以下错误:
invalid operands to binary expression ('int' and 'RGBTRIPLE')
基本上,我不知道如何正确地将 temp[i][j]
乘以一个因数。
我试过像 2 * int(temp[i][j])
这样的类型转换,但是那不起作用。我该怎么做呢?在这种情况下,我需要更多地了解类型吗?
void edges(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE temp[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
temp[i][j].rgbtRed = image[i][j].rgbtRed;
temp[i][j].rgbtGreen = image[i][j].rgbtGreen;
temp[i][j].rgbtBlue = image[i][j].rgbtBlue;
}
}
int red_gx, green_gx, blue_gx, red_gy, green_gy, blue_gy;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// Top Left Corner
if (i == 0 && j == 0)
{
red_gx = 0;
green_gx = 0;
blue_gx = 0;
red_gy = 0;
green_gy = 0;
blue_gy = 0;
}
//
// <-- some other elif statements here in between
//
// Any other pixel
else
{
red_gx = (-1 * (temp[i - 1][j - 1])) + temp[i - 1][j + 1] + (-2 * (temp[i][j - 1])) + (2 * (temp[i][j + 1])) + (-1 * (temp[i + 1][j - 1])) + (temp[i + 1][j + 1]);
// green_gx = (-1 * temp[i - 1][j - 1]) + temp[i - 1][j + 1] + (-2 * temp[i][j - 1]) + (2 * temp[i][j + 1]) + (-1 * temp[i + 1][j - 1]) + temp[i + 1][j + 1];
// blue_gx = (-1 * temp[i - 1][j - 1]) + temp[i - 1][j + 1] + (-2 * temp[i][j - 1]) + (2 * temp[i][j + 1]) + (-1 * temp[i + 1][j - 1]) + temp[i + 1][j + 1];
// red_gy = (-1 * temp[i - 1][j - 1]) + (-2 * temp[i - 1][j]) + (-1 * temp[i - 1][j + 1]) + temp[i + 1][j - 1] + (2 * temp[i + 1][j]) + temp[i + 1][j + 1];
// green_gy = (-1 * temp[i - 1][j - 1]) + (-2 * temp[i - 1][j]) + (-1 * temp[i - 1][j + 1]) + temp[i + 1][j - 1] + (2 * temp[i + 1][j]) + temp[i + 1][j + 1];
// blue_gy = (-1 * temp[i - 1][j - 1]) + (-2 * temp[i - 1][j]) + (-1 * temp[i - 1][j + 1]) + temp[i + 1][j - 1] + (2 * temp[i + 1][j]) + temp[i + 1][j + 1];
}
image[i][j].rgbtRed = round(sqrt(pow(round(red_gx), 2) + pow(round(red_gy), 2)));
image[i][j].rgbtGreen = round(sqrt(pow(round(green_gx), 2) + pow(round(green_gy), 2)));
image[i][j].rgbtBlue = round(sqrt(pow(round(blue_gx), 2) + pow(round(blue_gy), 2)));
}
}
return;
}
这里是 RGBTRIPLE 的定义:
RGBTRIPLE structure
(wingdi.h)
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} RGBTRIPLE, *PRGBTRIPLE, *NPRGBTRIPLE, *LPRGBTRIPLE;
它是一个“结构”,其元素由 3 个字节组成。很明显,您不能只将其视为整数。 “2 * int(temp[i][j])
”显然是非法的。
您 CAN 可以根据需要将 rgbtBlue、rgbtGreen 和 rgbtRed 累加到一个 32 位整数中。也许是这样的:
unsigned int color = (temp[i][j].rgbtRed << 16) | (temp[i][j].rgbtGreen << 8) | (temp[i][j].rgbtBlue);
您也许还可以定义 union。
但是为什么呢?也许您最好的选择是简单地将 R、G 和 B 视为“独立的”?
您可以将它们组合成一个 32 位整数
做你的数学然后把它放回去,wingdi.h
中有宏可以帮助你
wingdi.h
#define GetRValue(c) ((BYTE)(c))
#define GetGValue(c) ((BYTE)(((WORD)(c))>>8))
#define GetBValue(c) ((BYTE)((c)>>16))
#define RGB(r,g,b) ((COLORREF)((BYTE)(r)|((BYTE)(g) << 8)|((BYTE)(b) << 16)))
您可以按如下方式进行:
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// RGB macro takes 3 arguments of type BYTE(red, green ,blue)
// and returns 32-bit integer
int iColor = RGB(image[i][j].rgbtRed, image[i][j].rgbtGreen, image[i][j].rgbtBlue);
// do whatever you want with iColor
// then back to image
image[i][j].rgbtRed = GetRValue(iColor); // retrieves red value(BYTE)
image[i][j].rgbtGreen = GetGValue(iColor); // retrieves green
image[i][j].rgbtBlue = GetBValue(iColor); // retrieves blue
}
}
typedef union
{
struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
};
unsigned rawRGB;
} RGBTRIPLE, *PRGBTRIPLE, *NPRGBTRIPLE, *LPRGBTRIPLE;
那么你可以2 * temp[i][j].rawRGB
顺便说一句,将指针隐藏在 typedef
后面是一种非常糟糕的做法。避免,因为它通常会导致很难发现和调试错误。
以下代码在尝试编译时出现以下错误:
invalid operands to binary expression ('int' and 'RGBTRIPLE')
基本上,我不知道如何正确地将 temp[i][j]
乘以一个因数。
我试过像 2 * int(temp[i][j])
这样的类型转换,但是那不起作用。我该怎么做呢?在这种情况下,我需要更多地了解类型吗?
void edges(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE temp[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
temp[i][j].rgbtRed = image[i][j].rgbtRed;
temp[i][j].rgbtGreen = image[i][j].rgbtGreen;
temp[i][j].rgbtBlue = image[i][j].rgbtBlue;
}
}
int red_gx, green_gx, blue_gx, red_gy, green_gy, blue_gy;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// Top Left Corner
if (i == 0 && j == 0)
{
red_gx = 0;
green_gx = 0;
blue_gx = 0;
red_gy = 0;
green_gy = 0;
blue_gy = 0;
}
//
// <-- some other elif statements here in between
//
// Any other pixel
else
{
red_gx = (-1 * (temp[i - 1][j - 1])) + temp[i - 1][j + 1] + (-2 * (temp[i][j - 1])) + (2 * (temp[i][j + 1])) + (-1 * (temp[i + 1][j - 1])) + (temp[i + 1][j + 1]);
// green_gx = (-1 * temp[i - 1][j - 1]) + temp[i - 1][j + 1] + (-2 * temp[i][j - 1]) + (2 * temp[i][j + 1]) + (-1 * temp[i + 1][j - 1]) + temp[i + 1][j + 1];
// blue_gx = (-1 * temp[i - 1][j - 1]) + temp[i - 1][j + 1] + (-2 * temp[i][j - 1]) + (2 * temp[i][j + 1]) + (-1 * temp[i + 1][j - 1]) + temp[i + 1][j + 1];
// red_gy = (-1 * temp[i - 1][j - 1]) + (-2 * temp[i - 1][j]) + (-1 * temp[i - 1][j + 1]) + temp[i + 1][j - 1] + (2 * temp[i + 1][j]) + temp[i + 1][j + 1];
// green_gy = (-1 * temp[i - 1][j - 1]) + (-2 * temp[i - 1][j]) + (-1 * temp[i - 1][j + 1]) + temp[i + 1][j - 1] + (2 * temp[i + 1][j]) + temp[i + 1][j + 1];
// blue_gy = (-1 * temp[i - 1][j - 1]) + (-2 * temp[i - 1][j]) + (-1 * temp[i - 1][j + 1]) + temp[i + 1][j - 1] + (2 * temp[i + 1][j]) + temp[i + 1][j + 1];
}
image[i][j].rgbtRed = round(sqrt(pow(round(red_gx), 2) + pow(round(red_gy), 2)));
image[i][j].rgbtGreen = round(sqrt(pow(round(green_gx), 2) + pow(round(green_gy), 2)));
image[i][j].rgbtBlue = round(sqrt(pow(round(blue_gx), 2) + pow(round(blue_gy), 2)));
}
}
return;
}
这里是 RGBTRIPLE 的定义:
RGBTRIPLE structure (wingdi.h)
typedef struct tagRGBTRIPLE { BYTE rgbtBlue; BYTE rgbtGreen; BYTE rgbtRed; } RGBTRIPLE, *PRGBTRIPLE, *NPRGBTRIPLE, *LPRGBTRIPLE;
它是一个“结构”,其元素由 3 个字节组成。很明显,您不能只将其视为整数。 “2 * int(temp[i][j])
”显然是非法的。
您 CAN 可以根据需要将 rgbtBlue、rgbtGreen 和 rgbtRed 累加到一个 32 位整数中。也许是这样的:
unsigned int color = (temp[i][j].rgbtRed << 16) | (temp[i][j].rgbtGreen << 8) | (temp[i][j].rgbtBlue);
您也许还可以定义 union。
但是为什么呢?也许您最好的选择是简单地将 R、G 和 B 视为“独立的”?
您可以将它们组合成一个 32 位整数
做你的数学然后把它放回去,wingdi.h
中有宏可以帮助你
wingdi.h
#define GetRValue(c) ((BYTE)(c))
#define GetGValue(c) ((BYTE)(((WORD)(c))>>8))
#define GetBValue(c) ((BYTE)((c)>>16))
#define RGB(r,g,b) ((COLORREF)((BYTE)(r)|((BYTE)(g) << 8)|((BYTE)(b) << 16)))
您可以按如下方式进行:
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// RGB macro takes 3 arguments of type BYTE(red, green ,blue)
// and returns 32-bit integer
int iColor = RGB(image[i][j].rgbtRed, image[i][j].rgbtGreen, image[i][j].rgbtBlue);
// do whatever you want with iColor
// then back to image
image[i][j].rgbtRed = GetRValue(iColor); // retrieves red value(BYTE)
image[i][j].rgbtGreen = GetGValue(iColor); // retrieves green
image[i][j].rgbtBlue = GetBValue(iColor); // retrieves blue
}
}
typedef union
{
struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
};
unsigned rawRGB;
} RGBTRIPLE, *PRGBTRIPLE, *NPRGBTRIPLE, *LPRGBTRIPLE;
那么你可以2 * temp[i][j].rawRGB
顺便说一句,将指针隐藏在 typedef
后面是一种非常糟糕的做法。避免,因为它通常会导致很难发现和调试错误。