Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TBitmap32 verlustfrei stretchen funzt nicht (https://www.delphipraxis.net/84045-tbitmap32-verlustfrei-stretchen-funzt-nicht.html)

Martin K 10. Jan 2007 17:00


TBitmap32 verlustfrei stretchen funzt nicht
 
Hi,

ich will ein Bitmap verlustfrei vergrößern (also ohne dass es verpixelt wird, wie beim normalen TBitmap.Canvas.StretchDraw).
Dazu habe ich mir die Graphics32 runtergeladen und verwende nun ein TBitmap32 aus der Unit GR32.

Wenn ich diesen Code (den oberen Code) verwende, kennt er StretchFilter nicht :gruebel:

Ohne StretchFilter wirds bei Draw natürlich genauso verpixelt.

Was kann ich tun?

DGL-luke 10. Jan 2007 17:18

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
1. verlustfrei geht per definition NICHT. es gibt gute interpolationsfilter, die das bild je nach auflösung recht gut aussehen lassen.

2. das modell wurde bei GR32 in version 8.1 (?) komplett umgestellt. du arbeitest jetzt mit resamplern - bitte hier weiterlesen: [dp]gr32 resampl*[/dp].

TonyR 10. Jan 2007 17:24

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
Helfen kann ich dir bei dem Problem nicht, ich habe bloß eine weitere Sache gefunden, die du benutzen könntest (vielleicht funktionierts ja damit):

Auf dsdt.info steht nämlich auch etwas über bild skalierung (ganz unten) .... und da wird auf die GraphicEx-Library verwiesen!

Einen Versuch ists denke ich wert! :wink:

Martin K 10. Jan 2007 17:41

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
@DGL-luke: Also erstmal Danke für Deine Antwort!
Habe jetzt folgenden Code, allerdings wird es genauso verpixelt dargestellt wie vorher :?
Delphi-Quellcode:
BMP32.Width := Round(BMP.Height*Factor);
BMP32.Height := BMP.Height;
RES := TKernelResampler.Create(BMP32);
RES.Kernel := TMitchellKernel.Create; //oder TLanczosKernel, ändert nix
BMP32.Draw(Rect(0,0,BMP32.Width,BMP32.Height), Rect(0,0,BMP.Width,BMP.Height), BMP.Canvas.Handle);
BMP32 ist ein TBitmap32, BMP ein normales TBitmap.
Das Bitmap soll nur in der Breite gestreckt werden, da das Quellbitmap in der Breite gestaucht ist.

Nachtrag:
Wenn ich RES - wie man es ordentlich machen sollte - mit try..finally auch wieder freigeben will, gibts ne Zugriffsverletzung.
Warum denn das ?

@TonyR: Ich schau's mir mal an...

Khabarakh 10. Jan 2007 17:55

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
Wäre es zu viel verlangt, erst einmal in der Hilfe unter TBitmap32.Draw nachzuschlagen ;) ?

@edit:
Zitat:

Zitat von Martin K
Wenn ich RES - wie man es ordentlich machen sollte - mit try..finally auch wieder freigeben will, gibts ne Zugriffsverletzung.

Weil deine Vorgehensweise nicht ordentlich ist, schließlich ist das Bitmap für die Freigabe ab dem Zeitpunkt veranwortlich, an dem du seiner Eigenschaft die Instanz zuweißt - allerdings nicht verwechseln mit den vielen VCL-/ und anderen Properties, die die Instanz nur kopieren.

Martin K 10. Jan 2007 18:12

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
Zitat:

Zitat von Khabarakh
Wäre es zu viel verlangt, erst einmal in der Hilfe unter TBitmap32.Draw nachzuschlagen ;) ?

Die hilft mir leider auch nicht weiter :?
Meinst Du anstatt BMP.Canvas.Handle soll ich wieder ein TBitmap32 verwenden?
Hab ich ausprobiert, bringt keine Änderung...

Martin K 10. Jan 2007 20:15

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
Da es mit den Graphics32 nicht so richtig funktioniert, habe ich nun mal GraphicEx ausprobiert:
Damit funzt es einwandfrei und der Code ist auch viel einfacher:
Delphi-Quellcode:
Stretch(NewWidth, NewHeight, sfLanczos3, 0, BMP);
BMP ist ein normales TBitmap, es ist das Quellbitmap und auch das neue gestretchte Bitmap.

thx an TonyR für den Tipp!
:thumb:

Khabarakh 10. Jan 2007 21:20

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
Zitat:

Zitat von Martin K
Zitat:

Zitat von Khabarakh
Wäre es zu viel verlangt, erst einmal in der Hilfe unter TBitmap32.Draw nachzuschlagen ;) ?

Die hilft mir leider auch nicht weiter :?
Meinst Du anstatt BMP.Canvas.Handle soll ich wieder ein TBitmap32 verwenden?
Hab ich ausprobiert, bringt keine Änderung...

Inder Hilfe steht eindeutig, dass der Resampler dem Quell- und nicht dem Zielbitmap zugewiesen werden muss ;) .

Martin K 10. Jan 2007 21:53

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
Ach so hast Du das gemeint...

Hatte in der Hilfe nur nach Draw geschaut, weil:
Zitat:

Zitat von Khabarakh
Wäre es zu viel verlangt, erst einmal in der Hilfe unter TBitmap32.Draw nachzuschlagen ;) ?

Gut, wäre dann so vielleicht auch gegangen, aber mit GraphicEx ist es dann doch deutlich einfacher.
Hier braucht man nur ein Bitmap (nicht zwei), das ist dann auch das normale Bitmap und kein TBitmap32, außerdem muss man nicht diese extra Objekte für den Resampler erzeugen, usw...

Trotzdem danke für Deine Hilfe!


[Nachtrag]

Zitat:

Zitat von Khabarakh
Inder Hilfe steht eindeutig, dass der Resampler dem Quell- und nicht dem Zielbitmap zugewiesen werden muss ;) .

Also entweder bin ich blind, oder Du hast ne andere Hilfe.
Wo steht das denn???
Also hier nicht!

dizzy 11. Jan 2007 01:24

Re: TBitmap32 verlustfrei stretchen funzt nicht
 
Zitat:

Zitat von Martin K
[...] verlustfrei vergrößern [...]

Nur so halb-OT am Rande: Eine "verpixelte" Vergrößerung eines Bitmaps ist so verlustfrei wie es nur eben geht! Im Gegenteil: Man erzeugt sogar noch künstlich Redundanzen ;)
Beim Verkleinern schaut das aber wieder etwas anders aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz