加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 从PNG或GIF图像中屏蔽白色,使用任何颜色将其blit到画

发布时间:2020-12-15 09:11:45 所属栏目:大数据 来源:网络整理
导读:源是PNG或GIF,其中应该“着色”的像素是白色.背景可以是黑色或透明的,以最简单的方式. 现在我想剪出一个源的矩形部分,并用“画笔”的调色板颜色(gif)或RGB颜色(png)来剪切它,然后用它在TImage / TCanvas上“标记”它颜色. 可能是RTFM会做的那些懒惰问题之一.
源是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;

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

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

但这仅适用于位图图像.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读