Lazarus中文社区

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

QQ登录

只需一步,快速开始

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

GetDataLineStart使用出现问题

[复制链接]

该用户从未签到

发表于 2011-10-26 14:27:11 | 显示全部楼层 |阅读模式
写了一个用GetDataLineStart获取像素并复制的函数,但是图像复制以后出现了斑马状纵向条纹,请大家帮忙看看。
写此函数的目的只是摸索用内存法正确访问像素,为以后的数字图像处理创造条件。
function CopyBitMap2//逐像素复制一个位图,使用GetDataLineStart函数
  (InBMP: TBitMap; var OutBMP: TBitMap; var runs: string): boolean;
var
  TempBMP: TBitMap;
  IntfImg1, IntfImg2: TLazIntfImage;
  ImgHandle, ImgMaskHandle:HBitMap;
  px, py: Integer;
  Row1, Row2: PRGBTripleArray;

begin
  IntfImg1:=TLazIntfImage.Create(0, 0);
  IntfImg2:=TLazIntfImage.Create(0, 0);
  TempBMP:=TBitMap.Create;

  //将TBitMap载入到Lazarus的图形类IntfImg
    //必须完成载入操作以后才能正常操作IntfImg
  IntfImg1.LoadFromBitmap(InBMP.Handle, InBMP.MaskHandle);
  IntfImg2.LoadFromBitmap(TempBMP.Handle, TempBMP.MaskHandle);

  //IntfImg1的内容复制到IntfImg2
  IntfImg2.Width:=IntfImg1.Width;
  IntfImg2.Height:=IntfImg1.Height;

  for py:=0 to IntfImg2.Height-1 do
  begin
    Row1:=IntfImg1.GetDataLineStart(py);//类似Delphi的Scanline
    Row2:=IntfImg2.GetDataLineStart(py);
    for px:=0 to IntfImg1.Width do
    begin
      //Row2^[px]:=Row1^[px];
      //以下语句为逐像素的色彩赋值
      Row2^[px].rgbtBlue:=Row1^[px].rgbtBlue;
      Row2^[px].rgbtGreen:=Row1^[px].rgbtGreen;
      Row2^[px].rgbtRed:=Row1^[px].rgbtRed;
    end;
  end;

  //IntfImg2的内容复制给OutBMP
    //过程是CreateBitmaps,然后给Handle和MaskHandle赋值
  IntfImg1.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
  IntfImg2.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
  OutBMP.Handle:=ImgHandle;
  OutBMP.MaskHandle:=ImgMaskHandle;

  IntfImg1.Free;
  IntfImg2.Free;
  TempBMP.Free;

  runs:='OK';
  result:=true;
end;                    
回复

使用道具 举报

该用户从未签到

发表于 2011-10-26 20:35:41 | 显示全部楼层
必须设置两个TBitmap的PixelFormat := pf24bit;
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

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

GMT+8, 2025-5-3 08:49 , Processed in 0.026231 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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