Ich benutze .NET Framework (versucht 3.5 & amp; 4.0), um eine .TIFF-Datei zu laden und sie als .PNG zu speichern. Ich erwarte zwei aufeinanderfolgende Aufrufe der Save () - Methode (die dieselbe TIFF-Datei verwendet), um dieselbe PNG-Datei zu erstellen. Die produzierten Dateien sind jedoch "manchmal" anders.
Der folgende C # -Code zeigt das Problem:
%Vor%Dadurch wird "Diff" bei Iteration 8, 32, 33, 73, 114, 155, 196 unter Windows 64 angezeigt, während auf 32-Bit-Maschinen keine Fehler angezeigt werden. (Ich benutze x86 Ziel; mit x64 Ziel ist es schlechter: diff bei Iteration 12, 13, 14, 15, ...)
Gibt es eine Möglichkeit, ein reproduzierbares Ergebnis von Save () zu erhalten?
Ein Beispielbild finden Sie auf dieser FTP-Site
Ich kann nicht erklären, warum das passiert, aber es scheint, dass die nicht-deterministische Finalisierung der Image
-Objekte im Finalizer-Thread die Codierung von Bildern im Hauptthread beeinflusst. ( Image
implementiert IDisposable
, Sie sollten also Dispose
aufrufen, um es deterministisch zu bereinigen, wenn Sie es nicht mehr verwenden; andernfalls wird es zu einem beliebigen Zeitpunkt in der Zukunft fertiggestellt.)
Wenn ich Ihren Beispielcode in den folgenden ändern, bekomme ich die gleichen Ergebnisse von jedem Aufruf von Save
:
Beachten Sie, dass ich eine weitere Besonderheit gefunden habe: Beim Ausführen eines 32-Bit-Builds (x86) unter Windows 7 SP1 x64 haben die ersten zwei Aufrufe an Save
unterschiedliche Ergebnisse zurückgegeben, dann alle nachfolgenden Aufruf von Save
erzeugte die gleiche Ausgabe wie der zweite Aufruf. Um den Test zu bestehen, musste ich die ersten beiden Zeilen (vor der Schleife) wiederholen, um zwei Speicherungen zu erzwingen, bevor die Gleichheitsprüfungen durchgeführt wurden.
Tags und Links .net image system.drawing