源是 PNG 或 GIF,其中应“着色”的像素为白色。背景可以是黑色或透明,以最简单的为准。
现在我想切出源的矩形部分,并将其与“画笔”的调色板颜色(gif)或RGB颜色(png)相结合,以将其“标记”在TImage/上具有该颜色的 TCanvas。
可能是 RTFM 可以解决的懒惰问题之一。但如果您有好的解决方案,请分享:)
我尝试了 Daud 的 PNGImage 库,但我什至无法让它加载源图像。使用起来有什么技巧吗?
该解决方案需要在 D7 及更高版本、XP 及更高版本上运行。
最佳答案
我明白你想用其他颜色改变白色吗? 如果是这样,我认为您应该逐像素检查图像并检查像素是什么颜色,如果是白色则更改它。
这就是循环图像的方法
var
iX : Integer;
Line: PByteArray;
...
Line := Image1.ScanLine[0]; // We are scanning the first line
iX := 0;
// We can't use the 'for' loop because iX could not be modified from
// within the loop
repeat
Line[iX] := Line[iX] - $F; // Red value
Line[iX + 1] := Line[iX] - $F; // Green value
Line[iX + 2] := Line[iX] - $F; // Blue value
Inc(iX, 3); // Move to next pixel
until iX > (Image1.Width - 1) * 3;
以下代码展示了如何读取红色和蓝色值并切换它们。
var
btTemp: Byte; // Used to swap colors
iY, iX: Integer;
Line : PByteArray;
...
for iY := 0 to Image1.Height - 1 do begin
Line := Image1.ScanLine[iY]; // Read the current line
repeat
btSwap := Line[iX]; // Save red value
Line[iX] := Line[iX + 2]; // Switch red with blue
Line[iX + 2] := btSwap; // Switch blue with previously saved red
// Line[iX + 1] - Green value, not used in example
Inc(iX, 3);
until iX > (Image1.Width - 1) * 3;
end;
Image1.Invalidate; // Redraw bitmap after everything's done
但这仅适用于位图图像。
如果这有用,请尝试将图像转换为位图,然后对其进行操作。
关于delphi - 从 PNG 或 GIF 图像中屏蔽白色,使用任何颜色将其传输到 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6316400/