AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia GDI+ Delphi Berlin oder höher
Thema durchsuchen
Ansicht
Themen-Optionen

GDI+ Delphi Berlin oder höher

Ein Thema von Willie1 · begonnen am 12. Aug 2020 · letzter Beitrag vom 18. Aug 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.384 Beiträge
 
Delphi 12 Athens
 
#1

AW: GDI+ Delphi Berlin oder höher

  Alt 15. Aug 2020, 17:44
Was ist RationalBuff?

Bei dem MOVE, könnte man z.B. an ungültige Zeiger und einen Bufferoverflow denken.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
698 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: GDI+ Delphi Berlin oder höher

  Alt 15. Aug 2020, 18:54
RationlBuff ist ein Array[0..1] of Integer für Zähler und Nenner. Wie geht das ohne Move, ist mir klar, das das unsicher ist.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#3

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 12:18
Es geht hier um den Datentyp 5. Eigentlich soll er 8 Bytes lang sein mit 4 Bytes Zähler und 4 Bytes Nenner. Laut Spezifikation ist er "unsigned", müsste also 2 x Cardinal sein, denn es gibt ihn auch noch mit Vorzeichen als Typ 10.

Es ist aber keineswegs so, dass der Typ 5 immer nur 2 x 4 = 8 Bytes hat, zum Beispiel nicht bei den GPS-Werten. Bei GPSLongitude und GPSLatitude hat er 3 x 8 = 24 Bytes (das ist auch so bei EXIFTool vermerkt). Da könnte es bei deinem iPhone haken, weil es vermutlich GPS-Daten in die JPG schreibt. Daher ist deine Lösung nicht optimal an den Typ 5 angepasst.

Ich mache das ungefähr so (ist jetzt so dahingeworfen):
Delphi-Quellcode:
var Buff:TBytes;
    Zähler,Nenner,DritterWert:Cardinal;
begin
  SetLength(Buff,Length);
  Move(Value^, Buff[0], Length);
  Zähler := PCardinal(@TB[0])^;
  Nenner := PCardinal(@TB[4])^;
  If Length >= 12
    then DritterWert := PCardinal(@TB[8])^;
end;
Der Zusammenbau von GPSLatitude etc. ist auch nicht ganz trivial. Das verdeutlich das Prinzip, vielleicht hilft dir das erstmal weiter.

Geändert von Benmik (16. Aug 2020 um 12:29 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
698 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 15:50
Es geht hier um den Datentyp 5.

Der Zusammenbau von GPSLatitude etc. ist auch nicht ganz trivial. Das verdeutlich das Prinzip, vielleicht hilft dir das erstmal weiter.
Ja, es geht um PropertyTagTypeRational: 2 Zahlen = 4 Bytes für Zähler und Nenner. Ich hatte es mit Move gemacht, vor 15 Jahren konnte ich es nicht besser. Bennik, genau die Geo-Koordinaten haben mich auf diese Idee gebracht, es geht.
Delphi-Quellcode:
  Type
    TRationalBuff = array[0..1] of Integer;
    TPRationalBuff = ^TRationalBuff;

          else //alle anderen
          with PropItem^ do begin
// Move(Value^, RationalBuff, Length); //löst Fehler bei Apple aus
            RationalBuff := TPRationalBuff(Value)^;
            R1:=RationalBuff[0];
            R2:=RationalBuff[1];
            if R2 > 0 then
              s:=Format('%0.4f',[R1 / R2])
            else
              s:='error';
            s1:=ShowID(ShowTagStr, GetMetaDataIDString(id), PropID);
            Result:=Format('%s %s',[s1,s])
          end;
Die GDP-Dateien habe ich natürlich auch neu kompiliert, da gibt es viele string - Typen, jetzt alle als 16-Bit-String, Kann es da zu Problemen kommen? Ich weiß aus schmerzhafter Erfahrung Test- oder Demoprogramm ist das eine, der Einsatz in einem großen Programm ist das andere. Meine Motivation hatte ich oben erklärt. Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#5

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 17:45
Der RationalBuff kann nur 8 Byte aufnehmen, bei GPS sind es aber 24. Mit ihm kommst du also nicht an bestimmte GPS-Daten ran (GPSLongitude, GPSLatitude).

Move an sich ist völlig OK; man kann es auch über eine Pointer-Variable machen, aber dann hat man nicht die Flexibilität von TBytes. Ich meine, es ist immer noch am besten, Length zu messen, TBytes entsprechend zu dimensionieren und danach zu handeln.

Bei den Stringtypen von Typ 7 ist es nicht ganz so einfach, die können laut Spezifikation auch Unicode sein, worauf du mit AnsiChar nicht weiter kommst. Das betrifft vor allem UserComment. Man kann die Strings ruhig bei Delphi-String belassen, muss sich dann aber um die Konvertierungen kümmern.

Ich muss jetzt zum Zug; später komme ich eventuell dazu, etwas zu posten.

Geändert von Benmik (16. Aug 2020 um 17:47 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
698 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 18:43
Hallo Bennik, gute Fahrt, bei der Bahn muss man immer Sorgen haben!

Ich habe versucht mein Projekt von ca. 2008 mit D-Berlin zu kompilieren. Meine eigenen Komponenten zu integrieren war einfach. Aber es ist genauso, wie ich befürchtet hatte. Es knallen die Fehlermeldungen. Besonders eine Bibliothek von 2006 von Gerry McGuire dExif macht Probleme. Er hat wohl sehr tricky programmiert.
Ich muss bei Delphi 2005 bleiben: Trotzdem sind deine Hinweise für mich sehr wichtig. Sind AnsiString, AnsiChar PAnsiChar bei Delphi 2005 schon bekannt oder muss ich die Änderungen wieder zurücknehmen. Das wäre blöd.
Gruß Willie.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#7

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 19:41
Jetzt fahre ich 15 km mit dem Rad zum Bahnhof und der Zug fällt aus! So'n Mist. Und kein LTE.

dEXIF wollte ich dir empfehlen, aber ich dachte, du möchtest alles selber machen.

Schau doch mal auf diese Version, die mit Rio 10.3.3 anstandslos funktioniert. Mit dieser Unit brauchst du aber eigentlich überhaupt michts mehr selbst zu machen, was EXIF, betrifft, es ist alles fix und fertig.

Geändert von Benmik (17. Aug 2020 um 16:39 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 20:56 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