AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Schnelles nachladen von Bilddateien

Schnelles nachladen von Bilddateien

Ein Thema von Memnarch · begonnen am 15. Jan 2011 · letzter Beitrag vom 23. Mai 2023
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 15:54
@Aphton: Ja ich release das fertige projekt WENN es fertig ist^^.

Das mit dem 1Byte pro pixel wäre optimal, aber leider geht das wohl standartmässig mit PNGs nicht >.<.

Und jetzt hab ich mich doch glatt verhaspelt XD.
Hab alles in eine datei gepackt, und kenne beim auslesen startpunkt und länge jedes bildes. Wie lade ich das jetzt wieder richtig^^".
Vllt in eine Memorymappedfile lesen und dann der entsprechenden bildkomponennte zuweisen o.O

EDIT: hat schon geklappt, mit TMemoryStream

Geändert von Memnarch (16. Jan 2011 um 16:18 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 16:27
Das mit dem 1Byte pro pixel wäre optimal, aber leider geht das wohl standartmässig mit PNGs nicht >.<.
Wie kommst du darauf? Natürlich geht das! Ich hab dir den Link zu den möglichen Formaten doch schon geschickt...
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 17:18
Gut okay(dan habe ich wohl nicht richtig gelesen) aber wie bekomme ich die jetzt hin?
Ich meine ich habe hier seeeeehr viele bilder. Im moment 32bit RGBA(aus Vegas gerendert).
Gibt es da nen tool mit dme ich das mit allen "gleichzeitig" machen kann o.O.

Noch ein problem: Bisher habe ich TGPImage benutzt, das kann abe rnicht so ohne weiteres aus einem Memorystream lesen. (meine aktuelle funktion gibt einen memorystream mit den daten des gewünschten bildes zurück). Hatte dann gedacht auf TPNGImage umzusteigen, aber...dann kriege ich bei der übertraging von TPNG nach TBitmap per draw dochwieder nen geschwindigkeitsverlust oder?


MFG
Memnarch
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 19:20
Hallo,

auch TGPImage kann aus einem Stream lesen, natürlich nicht aus einem Delphi-Stream, aber aus einem IStream. Mit Delphi-Referenz durchsuchenTStreamAdapter hast Du aber eine Klasse, die aus für einen Stream dieses Interface implementiert.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#5

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 20:37
Ja adarauf war ich schon gestosse, da hatten man aber wohl probleme das richtig in dne istream zu bekommen weil delphi das nicht so gut implimentierte(oder so ähnlich) war vllt nen älterer beitrag, ich buddle habs datum nich gemerkt^^"

Werds mir nochmal angucken.

PS: jemand ne idee wo ich eine einführung finde wie ich in Delphi mit DirectX einfach images auf dem bildschirm zeichne?
Die einführungen die ich fand, fangen immer zielgerichtet auf 3d an, aber das bring tmich wneig weiter (DX mal ausprobieren wie sich das mit meinem projekt verträgt )
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#6

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 20:43
Direct3D und OpenGL sind, wie der Name schon vermuten lässt, Frameworks für 3D-Grafik und nicht für den 2D-Bereich. Das lässt sich auch nicht einfach umstellen. Bei OpenGL gibt es aber eine Funktion, die der Welt sagt, dass sie flach ist und dementsprechend auch keine Tiefe gezeichnet wird. Sowas wird es für Direct3D auch geben (hab ich so im Gefühl).

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!

Geändert von rollstuhlfahrer (16. Jan 2011 um 21:04 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 20:58
Man kann sowohl OpenGL als auch Direct3D ohne Probleme für 2D benutzen. Sogar die Windows-Oberfläche selbst basiert ab Vista auf Direct3D. Für OpenGL gibt's ein 2D-Tutorial auf DelphiGL.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#8

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 21:12
SO, also irgendwas mache ich hier falsch:

Code:
procedure LoadIdToImage(AId: Integer; ABitmap: TBitmap);
var
  Image: TGPImage;
  LStream: TMemoryStream;
  LStreamAdapter: TStreamAdapter;
begin
  LStream := TMemoryStream.Create;
  PackHelper.GetPackItem(AId, LStream);
  LStream.seek(0,soFromBeginning);
  LStreamAdapter := TStreamAdapter.Create(LStream, soReference);

  Image := TGPImage.Create();
  Image.FromStream(LStreamAdapter);
  try
    GPImageIntoBitmap(Image, ABitmap);
  finally
    Image.Free;
    LStreamAdapter.Free;
    LStream.Free;
  end;
end;
Kurz vorweg: Packhelper ist eine selbtgeschriebene klasse, die in dder Lage ist, dateien in meine Packete reinzupacken und rauszuholen.
Die GetPacketItem holt für den angegebenen Index die daten und packt sie in den übergebenen MemoryStream. GPImageIntoBitmap ist wie das Original von Xaromz, nur wird hier keine Bitmap zurückgegeben sondern in eine vorhandene übertragen.

GPImageIntoBitmap funzt ganz sicher, die benutze ich nämlcih auch, wnen ich TGPImage direkt von der Platte lade.

Der stream der von meinem PackHelper übergeben wird, scheint auch in ordnung zu sein. Ich haben den Erhaltenen Memorystream zu testzwecken einfach direkt als png file abgespeichert, resultat war die angeforderte Bildatei und schien auch OK zu sein.

Mach ich da oben was beim TSreamadapter komplett falsch?
Oder darf ich dne garnicht direkt übergeben? Sondenr muss das erst in einen IStream clonen ?

DAs problem ist nämlch, dass ich am ende eine "Ungültige Zeigeroperation" bekomme >.<

EDIT: achherje, habe gerade gesehen das CLONE nichteinmal implimentiert ist o.O. Aber hier gibts ne lösung die ich mal Probieren werde:
LINK

EDIT: nö klappt nochimmer nicht >.<.

EDIT2: schon gelöst, ich musste den TStreamAdapter constructor auf ein ISTREAM objeckt und auf kein TStreamAdapter anwenden XD

MFG
Memnarch

Geändert von Memnarch (16. Jan 2011 um 21:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#9

AW: Schnelles nachladen von Bilddateien

  Alt 18. Jan 2011, 13:38
Vielleicht noch so am Rande, der Original-Screensaver arbeitet wohl auch mit diesen Regionen. Man kann nämlich die Maus in den Flächen bewegen, wo der Desktop durchscheint und der Screensaver beendet sich nicht. Nur wenn zwischendurch eine schwarze Fläche in den Weg gerät. Heißt, du bräuchtest all diese Bilder gar nicht. Du kannst dir eine Masken-Datei anlegen und somit dein schwarzes Form immer wieder anpassen.
So kommst du auch auf die angesprochenen 1 Byte / Pixel. Wenn du diese Datei (bei mir sind es 0en und 1en) noch komprimieren lässt (GZip, Zip, etc.) kommst du am Ende auf weniger als 1 Byte / Pixel.

Ich werde dich jetzt nicht zwingen, das exakt so zu machen. Deine Methode hat auch was.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 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