使用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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |