Firstly, I'd like to propose a slight change to the scanlines example so that it is easier for developers to follow the code and to possibly incorporate bits of it into their own code.

type
  TBGRA = packed record
    b, g, r, a : byte;
  end;
  PBGRA = ^TBGRA;
  TBGRAArray = array[ WORD ] of TBGRA;
  PBGRAArray = ^TBGRAArray;


procedure TForm1.PaintToRGB32bitScanLine(Row, ImgWidth: integer;
  LineStart: Pointer);
// LineStart is pointer to the start of a scanline with the following format:
// 4 bytes per pixel. First byte is blue, second green, third is red.
// the fourth byte is the Alpha value, which is not specified in this
// example
// Black is 0,0,0, white is 255,255,255
var
  i: Integer;
  lrow : PBGRAArray
begin
  lrow := PBGRAArray( LineStart )

  // fill line with gray
  for i := 0 to ImgWidth - 1 do
  begin
    lrow^[ i ].r := 128; // set red to 128
    lrow^[ i ].g := 128; // set green to 128
    lrow^[ i ].b := 128; // set blue to 128
  end;
  // set one diagonal pixel to red ( this creates a diagonal red line )
lrow^[ ( Row mod ImgWidth ) ].r := 255; // set red to 255 - full intensity
  lrow^[ ( Row mod ImgWidth ) ].g := 0; // set green to 0
  lrow^[ ( Row mod ImgWidth ) ].b := 0; // set blue to 0
end;


I think this is a lot easier to understand than the previous version.

Secondly, I have a scanline issue that I hope someone on here can help with. I have 2 TImages on a Form ( I'm using Mac OS X if that makes any difference ) one contains an image of a yellow light bulb. I want to copy, pixel by pixel, the image from one TImage over to the second TImage. Yes I know I could just assign the bitmap from one to the other, but this is an exercise in Scanline manipulation. The problem I have is that once copied the second TImage contains a blue light bulb instead of a yellow one.

The code I'm using is..
  MyBitmap := TBitmap.Create;
  ScanLineImage := Image1.Picture.Bitmap.CreateIntfImage;
  MyBitmap.Width := ScanLineImage.Width;
  MyBitmap.Height:= ScanLineImage.Height;
  IntfImage := MyBitmap.CreateIntfImage;
ImgFormatDescription.Init_BPP32_B8G8R8_BIO_TTB( ScanLineImage.Width, ScanLineImage.Height );
  IntfImage.DataDescrption := ImgFormatDescription;

  for y := 0 to ScanLineImage.Height do
  begin
    lrow := ScanLineImage.GetDataLineStart( y );
    brow := IntfImage.GetDataLineStart( y );
    for x := 0 to ScanLineImage.Width do
    begin
      brow^[ x ].r := lrow^[ x ].r; // set red
      brow^[ x ].g := lrow^[ x ].g; // set green
      brow^[ x ].b := lrow^[ x ].b; // set blue
      brow^[ x ].a := lrow^[ x ].a; // set alpha value
    end;
  end;

  MyBitmap.LoadFromIntfImage( IntfImage );
  Image2.Picture.Bitmap := MyBitmap;


Can anyone see a flaw in my logic of using scanlines for this/this way?


Thanks,



Dominique.

_________________________________________________________________
    To unsubscribe: mail [EMAIL PROTECTED] with
               "unsubscribe" as the Subject
  archives at http://www.lazarus.freepascal.org/mailarchives

Reply via email to