gpt4 book ai didi

delphi - 如何在 Delphi 中将 PNG 图像的颜色从白色更改为黑色?

转载 作者:行者123 更新时间:2023-12-02 03:33:11 25 4
gpt4 key购买 nike

我在 Delphi XE2 中使用 Gustavo Daud 1.4 版的 TPNGList

它保存了一些我用作按钮图像的 PNG 256x256 图像。

但是需要改变背景颜色,图像对比度不好。

所以我现在有了深色背景的白色图像。

我需要将它们更改为黑色以获得浅色背景。

透明度是应该保持的。只有白色像素。但是,目标函数的通用源也很棒。

编辑:根据“去做吧”的建议,我尝试了以下方法,但只得到黑色或白色框:

procedure PNGInvertWB(Image: TPngImage; AWhite: Boolean);

procedure WBInvertRGB(var R, G, B: Byte);
var
color: LongInt;
begin
if AWhite then
begin
if RGB(R, G, B) = clWhite then
begin
Color := ColorToRGB(clBlack);
R := GetRValue(Color);
G := GetGValue(Color);
B := GetBValue(Color);
end;
end
else
begin
if RGB(R, G, B) = clBlack then
begin
Color := ColorToRGB(clWhite);
R := GetRValue(Color);
G := GetGValue(Color);
B := GetBValue(Color);
end;
end;
end;

var
X, Y, PalCount: Integer;
Line: PRGBLine;
PaletteHandle: HPalette;
Palette: array[Byte] of TPaletteEntry;
begin
if not (Image.Header.ColorType in [COLOR_GRAYSCALE, COLOR_GRAYSCALEALPHA]) then begin
if Image.Header.ColorType = COLOR_PALETTE then begin
PaletteHandle := Image.Palette;
PalCount := GetPaletteEntries(PaletteHandle, 0, 256, Palette);
for X := 0 to PalCount - 1 do
WBInvertRGB(Palette[X].peRed, Palette[X].peGreen, Palette[X].peBlue);
SetPaletteEntries(PaletteHandle, 0, PalCount, Palette);
Image.Palette := PaletteHandle;
end
else begin
for Y := 0 to Image.Height - 1 do begin
Line := Image.Scanline[Y];
for X := 0 to Image.Width - 1 do
WBInvertRGB(Line[X].rgbtRed, Line[X].rgbtGreen, Line[X].rgbtBlue);
end;
end;
end;
end;

我使用以下代码调用它:

procedure TDBNavigator.UpdateColor;
var
PNGImage: TPngImage;
HCColor : TColor;

procedure Invert(AImage: TImage; AWhite: boolean);
begin
ConvertToPNG(AImage.Picture.Graphic, PNGImage);
PNGInvertWB(PNGImage, not AWhite);
AImage.Picture.Graphic := PNGImage;
end;

begin
Color := ThemeManager.CurrentPallete.Color[FThemeColor];

HCColor := ThemeManager.CurrentPallete.HighContrast(FThemeColor);
if HCColor <> FCurrentColor then
begin
Invert(uiPrevious, HCColor = clWhite);
Invert(uiNext, HCColor = clWhite);
Invert(uiInsert, HCColor = clWhite);
Invert(uiPost, HCColor = clWhite);
Invert(uiCancel, HCColor = clWhite);
Invert(uiDelete, HCColor = clWhite);
Invert(uiRefresh, HCColor = clWhite);
FCurrentColor := HCColor;
end;
end;

不确定哪一部分是错误的。这是一个组件的一部分,我正在尝试更改在设计时分配的图像。我加载的是一个 PNG 图像,256x256,透明。

我需要使用那个 TImage,我知道它不是一个按钮。可能有一些组件可以做到这一点。我需要自己制作,因为我正在使用一个特定的库。

我从 PNGFunctions 上的 Gustavo 函数之一得到了 PNGInvertWB 的想法:

procedure MakeImageGrayscale(Image: TPngImage; Amount: Byte = 255);

那么,我根本没有处理图像的经验,这段代码有什么问题吗?

这就是我拥有图像的组件上的样子:

原文: Original

之后: After this funcion above

我使用了 PNGFunctions 中的以下函数来尝试此操作:

procedure MakeImageGrayscale(Image: TPngImage; Amount: Byte = 255);

procedure GrayscaleRGB(var R, G, B: Byte);
var
X: Byte;
begin
X := Round(R * 0.30 + G * 0.59 + B * 0.11);
R := Round(R / 256 * (256 - Amount - 1)) + Round(X / 256 * (Amount + 1));
G := Round(G / 256 * (256 - Amount - 1)) + Round(X / 256 * (Amount + 1));
B := Round(B / 256 * (256 - Amount - 1)) + Round(X / 256 * (Amount + 1));
end;

var
X, Y, PalCount: Integer;
Line: PRGBLine;
PaletteHandle: HPalette;
Palette: array[Byte] of TPaletteEntry;
begin
//Don't do anything if the image is already a grayscaled one
if not (Image.Header.ColorType in [COLOR_GRAYSCALE, COLOR_GRAYSCALEALPHA]) then begin
if Image.Header.ColorType = COLOR_PALETTE then begin
//Grayscale every palette entry
PaletteHandle := Image.Palette;
PalCount := GetPaletteEntries(PaletteHandle, 0, 256, Palette);
for X := 0 to PalCount - 1 do
GrayscaleRGB(Palette[X].peRed, Palette[X].peGreen, Palette[X].peBlue);
SetPaletteEntries(PaletteHandle, 0, PalCount, Palette);
Image.Palette := PaletteHandle;
end
else begin
//Grayscale every pixel
for Y := 0 to Image.Height - 1 do begin
Line := Image.Scanline[Y];
for X := 0 to Image.Width - 1 do
GrayscaleRGB(Line[X].rgbtRed, Line[X].rgbtGreen, Line[X].rgbtBlue);
end;
end;
end;
end;

我更改了 GrayscaleRGB,因为它获取每个像素并将其更改为灰度,所以我相信我可以相应地更改为黑色或白色。

最佳答案

很高兴看到您原来的内容以及执行此代码后得到的内容

问题是:您真的确定整个背景的颜色等于黑色或白色或者接近黑色或接近白色吗?因为你比较精确的颜色 RGB(R, G, B) = clWhite

试试这个

procedure WBInvertRGB(var R, G, B: Byte);
var
color: LongInt;
begin
if AWhite then
begin
if ((R>240) and (G>240) and (B>240)) then
begin
Color := ColorToRGB(clBlack);
R := GetRValue(Color);
G := GetGValue(Color);
B := GetBValue(Color);
end;
end
else
begin
if ((R<15) and (G<15) and (B<15)) then
begin
Color := ColorToRGB(clWhite);
R := GetRValue(Color);
G := GetGValue(Color);
B := GetBValue(Color);
end;
end;
end;

你会得到什么?

关于delphi - 如何在 Delphi 中将 PNG 图像的颜色从白色更改为黑色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com