아래 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;