Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 1558|回复: 1

分享个真彩BMP转灰度的代码

[复制链接]

该用户从未签到

发表于 2014-4-10 15:56:44 | 显示全部楼层 |阅读模式
本帖最后由 tigerA15 于 2014-4-10 16:00 编辑



终于找到BMP的原始像素的储存地址了,相对于scanline,我更愿意用一层循环去完成像素的转换...

procedure fpGrayscale2(const Bitmap: TBitmap; YuvConvert: boolean);
var
  PRGB: pRGBTriple;
  size, y, x, gray: integer;
begin
  Bitmap.BeginUpdate(); //beginupdate和endupdate必须要加在lazarus上才会生效,在delphi下则不需要,奇了个怪 ^_^
  try
    PRGB := pRGBTriple(Bitmap.RawImage.Data);
    size := Bitmap.RawImage.DataSize div 3;
    if (YuvConvert) then
    begin
      for y := 0 to size - 1 do
      begin
        gray := (77 * PRGB^.rgbtRed + 151 * PRGB^.rgbtGreen + 28 *
          PRGB^.rgbtBlue) shr 8;
        PRGB^.rgbtRed := Gray;
        PRGB^.rgbtGreen := Gray;
        PRGB^.rgbtBlue := Gray;
        Inc(PRGB);
      end;
    end
    else
    begin
      for y := 0 to size - 1 do
      begin
        gray := (PRGB^.rgbtRed + PRGB^.rgbtGreen + PRGB^.rgbtBlue) div 3;
        PRGB^.rgbtRed := Gray;
        PRGB^.rgbtGreen := Gray;
        PRGB^.rgbtBlue := Gray;
        Inc(PRGB);
      end;
    end;
  finally
      Bitmap.EndUpdate();
  end;
end;
因为直接对内存中的像素操作,所以转换速度非常快。










回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2014-4-10 16:00:59 | 显示全部楼层
由于pRGBTriple只针对24bit的BMP,所以调用前记得先检测下 bitamp的对象是否24bit位图。。。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 20:28 , Processed in 0.028368 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表