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

使用delphi将PNGImage转换为灰度

发布时间:2020-12-15 09:43:22 所属栏目:大数据 来源:网络整理
导读:嗨,您好 这是我的代码: procedure TForm4.Button1Click(Sender: TObject);var png: TPNGImage; data: PRGBQarray; p: ^tagRGBQuad; i,o: integer;begin png := TPNGImage.Create; try png.LoadFromFile('C:Untitled.png'); for o := 1 to 100 do begin dat
嗨,您好
这是我的代码:

procedure TForm4.Button1Click(Sender: TObject);
var
  png: TPNGImage;
  data: PRGBQarray;
  p: ^tagRGBQuad;
  i,o: integer;
begin
  png := TPNGImage.Create;
  try
    png.LoadFromFile('C:Untitled.png');
    for o := 1 to 100 do
    begin
      data:=png.Scanline[o];
      for I := 1 to 400 do
      begin
        p := @data^[i];
        p.rgbGreen := p.rgbBlue;
        p.rgbRed := p.rgbGreen;
      end;
    end;
    img.picture.Assign(png);
  finally
    png.Free;
  end;
end;

它不起作用,它使pic杂乱,我确定这是因为rgbReserved.
我该怎么办?

解决方法

这是如何灰化位图. (并且,是的,如果你想要对PNG进行灰化,你首先需要从中获取位图数据.我认为VCL会为你做这个.)

type
  PRGB32Array = ^TRGB32Array;
  TRGB32Array = packed array[0..MaxInt div SizeOf(TRGBQuad)-1] of TRGBQuad;

procedure MakeGrey(Bitmap: TBitmap);
var
  w,h: integer;
  y: Integer;
  sl: PRGB32Array;
  x: Integer;
  grey: byte;
begin
  Bitmap.PixelFormat := pf32bit;
  w := Bitmap.Width;
  h := Bitmap.Height;
  for y := 0 to h - 1 do
  begin
    sl := Bitmap.ScanLine[y];
    for x := 0 to w - 1 do
      with sl[x] do
      begin
        grey := (rgbBlue + rgbGreen + rgbRed) div 3;
        rgbBlue := grey;
        rgbGreen := grey;
        rgbRed := grey;
      end;
  end;
end;

样品用法:

procedure TForm4.Button1Click(Sender: TObject);
var
  bm: TBitmap;
begin
  bm := TBitmap.Create;
  try
    bm.LoadFromFile('C:UsersAndreas RejbrandPicturesPortr?tt,litet,kvadratiskt.bmp');
    MakeGrey(bm);
    Canvas.Draw(0,bm);
  finally
    bm.Free;
  end;
end;

(编辑:李大同)

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

    推荐文章
      热点阅读