![]() |
Wie arbeitet StretchBlt genau ?
Ich habe 2 Bitmaps, b1 und b2 und es gilt
b1.width = b1.height b2.width = b2.height b2.width >= b1.width also beide quadratisch und b2>=b1. Nun mache ich
Delphi-Quellcode:
Ich suche nach einer Möglichkeit, von der Position eines beliebigen Pixel in b2 die korrespondierende Position in b1 zu ermitteln.
w1:=b1.width;
w2:=b2.width; StretchBlt(b2.Canvas.Handle,0,0,w2,w2,b1.Canvas.Handle,0,0,w1,w1,srccopy); Das ist einfach, wenn b2 genau n mal so groß ist, wie b1, denn dann werden alle Pixel aus b1 n Mal in b2 abgebildet. Wenn aber nicht so klare Verhältnisse herrschen, zum Beispiel w1=137 und w2=215, dann ist StretchBlts Arbeitsweise für mich nicht eindeutig klar. Ich erziele schon ganz gute Ergebnisse mit
Delphi-Quellcode:
aber von fehlerfrei bin ich weit entfernt.
x1:=Round(x2*(w1-1)/(w2-1))
|
Re: Wie arbeitet StretchBlt genau ?
Ich vermute mal, StretchBlt verwendet Nearest-neighbor interpolation oder Bilineare interpolation.
Bei Nearest-neighbor kannst du direkt zurückschließen, welcher pixel des ausgangsbildes zu dem pixel des Zielbilds gehört - aber das Ergebnis sieht pixelig und unschön aus. Bei bilinearer (oder gar bikubischer) Interpolation geht das nicht so einfach - hier wird ein Pixel des Zielbilds ja aus vier Pixeln des Orginalbilds errechnet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz