Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bilder [mit/ohne Transparenz] in universelles Format bringen (https://www.delphipraxis.net/189980-bilder-%5Bmit-ohne-transparenz%5D-universelles-format-bringen.html)

himitsu 16. Aug 2016 15:04

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Zitat:

Zitat von Neutral General (Beitrag 1344971)
Wenn der Benutzer ein Bild auswählt erzeuge anhand der Dateiendung ein Objekt der entsprechenden TGraphic-Klasse (TPNGImage, TBitmap, ...).

Nja, bezüglich TImage ... joar, ist blöd, vorallem wenn nicht-visuell.

Aber man kann auch TPicture direkt verwenden.
Bei dem registrieren sich standardmäßig alle TGraphic-Klassen mit ihren Dateiendungen.
Picture.LoadFromStream geht da leider nicht, da diese Delphi-Klassen ausschließlich auf die Dateiendung achten, welche es beim Stream nicht gibt.
Picture.LoadFromFile nimmt dann anhand der Dateiendung eine der registrierten TGraphic, erstellt davon eine Instanz in Picture.Graphic und läd da rein dann das Bild.

bytecook 16. Aug 2016 15:08

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Zitat:

Zitat von Sherlock (Beitrag 1344989)
Also sooo langsam ist ein TWICImage dann doch nicht. Ein LoadFromFile dauert weniger als eine Sekunde...natürlich hängt es etwas von der Dateigröße und dem Speicherort ab.

Sherlock

Stimmt :) Hängt aber davon ab, wie groß die Texturen oder Graphiken sein sollen - und ob du auf deinem System DirectX installieren kannst...

berens 16. Aug 2016 15:10

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Mit TWICImage geht es durchaus schnell und zuverlässig! (Oben habe ich den Code mit Edit nachgetragen um nicht Antworten zu spammen).

Nur wie verkleinere ich die Bilder? Wie gesagt, der verlinkte Code erfordert Units, die ich nicht habe...

Edit: Danke @bytecook für den Code, aber ich lade explizit nicht über die TPortableNetworksGraphic32, weil die Dateien ja auch was anderes als .png sein können. Kann natürlich sein, dass die wegen Vererbung von TBitmap32 auch JPEG etc. lädt, aber naja...

Natürlich ist TPicture stilvoller als TImage, mal schauen, was im fertigen Code übrigbleibt. :)

EWeiss 16. Aug 2016 15:12

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Ich kenn das TWICImage nicht..
Aber wenn das auf GDI+ basiert könnte das verkleinern mit DrawImageRectRectI funktionieren.

gruss

bytecook 16. Aug 2016 15:16

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Zitat:

Zitat von EWeiss (Beitrag 1344994)
Ich kenn das TWICImage nicht..
Aber wenn das auf GDI+ basiert könnte das verkleinern mit DrawImageRectRectI funktionieren.

gruss

TWicImage ist bei Delphi mit an Bord...

Aber: Hier schon mal nachgesehen? http://www.dev-center.de/header/glbitmap
Imho solltest du ganz einfach die Textur laden können, da png unterstützt wird.

Ansonsten mal im DGL Forum Bergmann89 fragen, der gited ja die TGlBitmap...

Sherlock 16. Aug 2016 15:18

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Die Unit winapi.wincodec gibt es unter D2010 noch nicht? :shock:

Eventuell ohne Namespace...oder nur winapi.

Sherlock

berens 16. Aug 2016 15:20

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Leider verfügt weder TWicImage nach TPNGImage (als "Mittelsmann"), noch TPortableNetworkGraphic32 über einen Canvas, auf den ich mit Stretchdraw zeichen könnte. :shock:

> Ich kenn das TWICImage nicht..
Der Aussage kam nicht von mir, ich kann es ja problemlos benutzen.

Auf glBitmap soll das ganze ja letztendlich drauf. Leider _muss_ ich die Graphiken bearbeiten (verkleinern) bevor ich sie an glBitmap übergebe. Und je nach Dateiformat kann es mit glBitmap zu gewaltigen Problemen kommen, deshalb bin _ich_ für eine gültige Graphik zuständig und muss diese sicherstellen.

Edit: Es gibt tatsächlich die WinCodec Unit, damit geht das Resize (hatte versucht "WindowsCodec" wie in der Hilfe beschrieben zu verwenden). Jetzt muss ich den Code nur noch für Breite und Höhe anpassen:

Delphi-Quellcode:
procedure ResizeImage(aWICImage: TWICImage; NewWidth:Integer; NewHeight: Integer);
var
  scale: IWICBitmapScaler;
  wicBitmap: IWICBitmap;
begin
  if Assigned(aWICImage) then
  begin
    aWICImage.ImagingFactory.CreateBitmapScaler( scale);
    scale.Initialize(aWICImage.Handle, NewWidth, NewHeight, WICBitmapInterpolationModeFant);
    aWICImage.ImagingFactory.CreateBitmapFromSourceRect(scale, 0,0,NewWidth, NewHeight, wicBitmap);
    if Assigned(wicBitmap) then
      aWICImage.Handle := wicBitmap;
  end;
end;

himitsu 16. Aug 2016 15:25

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Liegt im XE in der Graphics.pas und Wincodec.pas

Einen HDC finde ich auch nicht, wo man ein TCanvas dran hängen könnte.

EWeiss 16. Aug 2016 15:27

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Ich verstehe das Problem jetzt nicht.
Du lädst eine Grafik (Bild) über TWicImage.

Danach konvertierst du dieses in eine Texture ?
Dann sollte doch nach einem glBindTexture über Quader diese sich verkleinern lassen.

Oder sehe ich da was falsch?

gruss

bytecook 16. Aug 2016 15:28

AW: Bilder [mit/ohne Transparenz] in universelles Format bringen
 
Zitat:

Zitat von berens (Beitrag 1344997)
Leider verfügt weder TWicImage nach TPNGImage (als "Mittelsmann"), noch TPortableNetworkGraphic32 über einen Canvas, auf den ich mit Stretchdraw zeichen könnte. :shock:

> Ich kenn das TWICImage nicht..
Der Aussage kam nicht von mir, ich kann es ja problemlos benutzen.

Auf glBitmap soll das ganze ja letztendlich drauf. Leider _muss_ ich die Graphiken bearbeiten (verkleinern) bevor ich sie an glBitmap übergebe. Und je nach Dateiformat kann es mit glBitmap zu gewaltigen Problemen kommen, deshalb bin _ich_ für eine gültige Graphik zuständig und muss diese sicherstellen.

Deswegen würde ich eben Graphics32 nehmen...

1) Bild via LoadPng it ein TBitmap32 laden.
2) Bild auf gewünschte Größe resamplen. (Am besten je nach Geschmack/Quali mit einem Lanczos Resampler). Die meisten Lowlevel-Routinen in Gr32 sind SSE2 optimiert, also seeeehr schnell...
3) Verkleinertes Bild auf GlBitmap via Scanline übertragen. (Siehe https://delphigl.com/forum/viewtopic...hics32#p100074)

oder ...

3b) eine Titan X kaufen :P

Raster Resampling Infos:
http://graphics32.org/documentation/...terization.htm
http://graphics32.org/documentation/...lers/_Body.htm


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz