Q&A

  • Bitmap 의 ScanLine 에서 RGBTriple 관련
아래 Button1Click 처럼 Bitmap 을 하나 불러와서

그것을 ScanLine 으로 읽어서 픽셀정보를 읽어와서 픽셀을 변경하려고

하는데 비트맵의 크기에 따라서 For 루프를 돌려서 할려고 합니다.

비트맵은 트루컬러에 크기는 256*256 이 넘는 크기이고..



그런데 아래처럼 TRGBTripleArray 가 255 개의 배열이니까

일단 그것이 비트맵의 Width, Height 만큼 ScanLine 로 읽어서

배열에 접근할 수가 없습니다.

TRGBTripleArray 의 배열크기를 256 보다 더 넓혀 준다고 해도

420 정도가 넘으면 접근할수 없다는 에러가 나버립니다..

그런데 그림크기가 640*480 인데 한줄만 ScanLine 하고

그림의 Width 만큼 for 루프를 돌려서 색상변환을 하지

않더라도 그 줄전체의 색상이 변경되는 걸로 봐서는

꼭 그림의 Width 만큼 for 루프를 돌리지 않고 for i:=1 to 255 까지만

해도 그줄 전체가 변경되긴 하던데 .. 어떻게 해야 그 줄 전체를

255 넘어간 X 좌표상의 픽셀까지 색깔을 조절할 수 있는지 알려주세요.



procedure TForm1.Button1Click(Sender: TObject);

type

PRGBTripleArray = ^TRGBTripleArray;

TRGBTripleArray = array [0..255] of TRGBTriple;

var

x,y,BmpWidth,BmpHeight : Integer;

BitMap1, Bitmap2 : TBitMap;

TmpByte: Byte;

TmpRGB: TRGBTriple;

P1, P2 : PRGBTripleArray; // PByteArray.. (256 컬러라면..)

DifferentBmp: Boolean;

begin

DifferentBmp:=false;

BitMap1 := TBitMap.create;

try

BitMap1.LoadFromFile('c:Windows설치.bmp');

Bitmap2:=TBitmap.Create;

Bitmap2.Width:=Bitmap1.Width;

Bitmap2.Height:=Bitmap1.Height;

BitBlt(Bitmap2.Canvas.handle, 0, 0, Bitmap2.Width, Bitmap2.Height,

Bitmap1.Canvas.handle, 0, 0, SRCCOPY);



BmpWidth:=Bitmap1.Width;

BmpHeight:=Bitmap1.Height;



try

// GetMem(P1, SizeOf(TRGBTriple)*1000);

try

for y:=BmpHeight downto 1 do

begin

P1 := BitMap1.ScanLine[y];

// P2 := Bitmap2.ScanLine[y];



for x:=BmpWidth downto 1 do

begin

//TmpByte:=P1^[x];

//P1^[x]:=(TmpByte*3 + $FF*7) div 10;

TmpRGB:=P1^[x];

TmpRGB.rgbtBlue:=(TmpRGB.rgbtBlue*2 + $FF*8) div 10;

TmpRGB.rgbtRed:=(TmpRGB.rgbtRed*2 + $FF*8) div 10;

TmpRGB.rgbtGreen:=(TmpRGB.rgbtGreen*2 + $FF*8) div 10;

P1^[x]:=TmpRGB;

// 색상 변환..

end;

end;

Form1.Canvas.Draw(0, 0, Bitmap1);

finally

Bitmap2.Free;

end;

finally

// FreeMem(P1);

end;

finally

BitMap1.free;

end;

end;



0  COMMENTS