15. oktober 2004 - 19:51Der er
2 kommentarer og 1 løsning
Alternativt komponent til TImage
Når man læser et billede ind i et TImage, f.eks. et billede fra et digitalkamera, og stretch := true så billedet ikke vises i sin naturlige størrelse, får billedet ofte et noget "grynet" udseende.
Findes der et andet komponent i stedet der viser billederne på en pæn måde uanset hvilken størrelse det vises i. Ligesom når et billede vises i windows XP's egen "billedviser".
Det er ikke så meget højdr / breddeforholdet der er problemet, men som sagt det at billeder der der indlæses fra filer der har "overstørrelse" i forhold til den størrelse, det er givet på formen. Jeg har foreløbig løst ved ved at resample billedet før det indlæses i TImage - komponenten og så gøre det om hver gang "brugeren" ændre billedets størrelse. Det virker OK. Jeg benytter denne en resamplemetode:
//Speed up by Renate Schaaf, Armido, Gary Williams... procedure SmoothResize(src, dest: tBitmap); type PRGB24 = ^TRGB24; TRGB24 = packed record B: Byte; G: Byte; R: Byte; end; var x, y, ix, iy: integer; x1, x2, x3: integer;
if src.PixelFormat <> pf24bit then src.PixelFormat := pf24bit; if dest.PixelFormat <> pf24bit then dest.PixelFormat := pf24bit; w := Dest.Width; h := Dest.Height;
if (src.Width <= dest.Width) and (src.Height <= dest.Height) then begin
dest.Assign(src);
exit; end;
iDst := (w * 24 + 31) and not 31; iDst := iDst div 8; //BytesPerScanline iSrc := (Src.Width * 24 + 31) and not 31; iSrc := iSrc div 8; try xscale := 1 / (w / src.Width); yscale := 1 / (h / src.Height); except on exception do end; // X lookup table SetLength(lutX, w); x1 := 0; x2 := trunc(xscale); for x := 0 to w - 1 do begin lutX[x] := x2 - x1; x1 := x2; x2 := trunc((x + 2) * xscale); end;
// Y lookup table SetLength(lutY, h); x1 := 0; x2 := trunc(yscale); for x := 0 to h - 1 do begin lutY[x] := x2 - x1; x1 := x2; x2 := trunc((x + 2) * yscale); end;
r := (c1.R + c2.R + (c3.R * -12) + c4.R + c5.R) div -8; g := (c1.G + c2.G + (c3.G * -12) + c4.G + c5.G) div -8; b := (c1.B + c2.B + (c3.B * -12) + c4.B + c5.B) div -8;
if r < 0 then r := 0 else if r > 255 then r := 255; if g < 0 then g := 0 else if g > 255 then g := 255; if b < 0 then b := 0 else if b > 255 then b := 255;
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.