13. maj 2005 - 13:16
Der er
2 kommentarer og
1 løsning
Nedskalering af bitmap
Jeg har brug for en kode til at nedskalere bitmaps. Den skal bruges til at lave thumbnails, og forholdet mellem højde og bredde skal derfor være konstant. Man skal kunne definere en max-højde / max-bredde.
Kort sagt svarer det til at en Timage har proportional:=true og Stretch:=true. Med en given højde og bredde.
Nogle der kan hjælpe?
OK... Nu det endelige spørgsmål.
Jeg ønsker at gøre det vha. linear interpolation, men kan ikke få det til at virke. Her er lidt source code, som skule virke, men der mangler et end et eller andet sted. Og jeg ved ikke hvor.
Jeg har prøvet at sætte det ind til sidst, men det ser ikke ud til at virke.
Her er den source code jeg fandt:
type
TRGBTripleArray = array[0..32767] of TRGBTriple;
PRGBTripleArray = ^TRGBTripleArray;
// shrink a bitmap by a given ratio
procedure Shrink(ARatio : Real ; ABitmap, ABitmapOut : TBitmap);
Var
Lx, Ly : integer;
LyBox, LxBox, LyBox1, LyBox2, LxBox1, LxBox2 : integer;
TR, TG, TB : integer;
avR, avG, avB : integer;
LRowIn, LRowOut : pRGBTripleArray;
LBoxCount : integer;
LRowBytes : integer;
LBoxRows : array of pRGBTripleArray;
begin
SetLength(LBoxRows, trunc(ARatio)+1);
LRowOut := ABitmapOut.ScanLine[0];
LRowBytes := Integer(ABitmapOut.Scanline[1]) - Integer(LRowOut);
for Ly := 0 to ABitmapOut.Height-1 do begin
LyBox1 := trunc(Ly*ARatio);
LyBox2 := trunc((Ly+1)*ARatio) - 1;
for LyBox := LyBox1 to LyBox2 do
LBoxRows[LyBox-LyBox1] := ABitmap.ScanLine[LyBox];
for Lx := 0 to ABitmapOut.Width-1 do begin
LxBox1 := trunc(Lx*ARatio);
LxBox2 := trunc((Lx+1)*ARatio) - 1;
TR := 0; TG := 0; TB := 0;
LBoxCount := 0;
for LyBox := LyBox1 to LyBox2 do begin
LRowIn := LBoxRows[LyBox-LyBox1];
for LxBox := LxBox1 to LxBox2 do begin
TR := TR + LRowIn[LxBox].rgbtRed;
TG := TG + LRowIn[LxBox].rgbtGreen;
TB := TB + LRowIn[LxBox].rgbtBlue;
Inc(LBoxCount);
end;
end;
avR := TR div LBoxCount;
avG := TG div LBoxCount;
avB := TB div LBoxCount;
LRowOut[Lx].rgbtBlue := avB;
LRowOut[Lx].rgbtGreen := avG;
LRowOut[Lx].rgbtRed := avR;
end;
Inc(Integer(LRowOut), LRowBytes);
end;
end;