Avatar billede cyberjelle Nybegynder
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?
Avatar billede cyberjelle Nybegynder
13. maj 2005 - 14:48 #1
Jeg har leget lidt med Stretchdraw, men resultatet bliver ikke tilfredsstillende. Jeg har læst noget om, at man skal lave en optimering bagefter.
Avatar billede cyberjelle Nybegynder
13. maj 2005 - 17:39 #2
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;
Avatar billede cyberjelle Nybegynder
13. maj 2005 - 21:39 #3
Ok... Det her spørgsmål er så fucked up, at jeg lukker det.. Der mangler ikke et end, det er bare mig..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester