如何使用Delphi将PNG或GIF图像中的白色屏蔽,并用任意颜色将其blit到画布上?

2026-04-10 18:202阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计526个文字,预计阅读时间需要3分钟。

如何使用Delphi将PNG或GIF图像中的白色屏蔽,并用任意颜色将其blit到画布上?

源图为PNG或GIF,其中应包含着色的图像是白色。背景可以是黑色或透明的,以最简单的方式呈现。现在我想剪出一个源图的矩形部分,并用画笔的调色板颜色(GIF)或RGB颜色(PNG)来剪切它,然后使用它。

源是PNG或GIF,其中应该“着色”的像素是白色.背景可以是黑色或透明的,以最简单的方式.

现在我想剪出一个源的矩形部分,并用“画笔”的调色板颜色(gif)或RGB颜色(png)来剪切它,然后用它在TImage / TCanvas上“标记”它颜色.

可能是RTFM会做的那些懒惰问题之一.但如果你有一个很好的解决方案请分享:)

我尝试了Daud的PNGImage lib,但我甚至无法加载源图像.使用它有诀窍吗?

该解决方案需要在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;

这是代码,显示如何读取红色和蓝色值并切换它们.

如何使用Delphi将PNG或GIF图像中的白色屏蔽,并用任意颜色将其blit到画布上?

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

但这仅适用于位图图像.

如果这很有用,请尝试将图像转换为位图,然后再操作它.

本文共计526个文字,预计阅读时间需要3分钟。

如何使用Delphi将PNG或GIF图像中的白色屏蔽,并用任意颜色将其blit到画布上?

源图为PNG或GIF,其中应包含着色的图像是白色。背景可以是黑色或透明的,以最简单的方式呈现。现在我想剪出一个源图的矩形部分,并用画笔的调色板颜色(GIF)或RGB颜色(PNG)来剪切它,然后使用它。

源是PNG或GIF,其中应该“着色”的像素是白色.背景可以是黑色或透明的,以最简单的方式.

现在我想剪出一个源的矩形部分,并用“画笔”的调色板颜色(gif)或RGB颜色(png)来剪切它,然后用它在TImage / TCanvas上“标记”它颜色.

可能是RTFM会做的那些懒惰问题之一.但如果你有一个很好的解决方案请分享:)

我尝试了Daud的PNGImage lib,但我甚至无法加载源图像.使用它有诀窍吗?

该解决方案需要在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;

这是代码,显示如何读取红色和蓝色值并切换它们.

如何使用Delphi将PNG或GIF图像中的白色屏蔽,并用任意颜色将其blit到画布上?

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

但这仅适用于位图图像.

如果这很有用,请尝试将图像转换为位图,然后再操作它.