【问题标题】:Mask out white color from PNG or GIF image, blit it to canvas using any color从 PNG 或 GIF 图像中屏蔽白色,使用任何颜色将其粘贴到画布上
【发布时间】:2011-06-11 14:17:54
【问题描述】:

源是 PNG 或 GIF,其中应“着色”的像素为白色。背景可以是黑色或透明,以最简单的为准。

现在我想剪下源的一个矩形部分,然后用“画笔”的调色板颜色 (gif) 或 RGB 颜色 (png) 将其“标记”在 TImage/具有该颜色的 TCanvas。

可能是 RTFM 会做的那些懒惰的问题之一。但是,如果您有一个不错的解决方案,请分享:)

我尝试了 Daud 的 PNGImage 库,但我什至无法让它加载源图像。使用它有什么技巧吗?

该解决方案需要在 D7 及更高版本、XP 及更高版本上运行。

【问题讨论】:

  • d7 及以上是什么意思?你还在使用那个非法版本的 d7?

标签: delphi colors mask blit


【解决方案1】:

我了解您想用其他颜色更改白色吗? 如果是这样,我认为您应该逐像素检查图像并检查像素是什么颜色,如果是白色则更改它。

这就是你如何循环图像

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

但这仅适用于位图图像。

如果这有用,请尝试将您的图像转换为位图,然后对其进行操作。

【讨论】:

  • 谢谢。这不会掩盖 PNG 或 GIF,但被接受为答案,因为它暗示了一种可能很慢的滚动方式。 (而且因为这个问题很老,没有得到更多的答案。:))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2012-05-14
  • 2018-06-14
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多