Gibt es eine günstige Möglichkeit, die Abmessungen eines Bildes zu ermitteln (jpg, png, ...)? Vorzugsweise möchte ich dies nur mit der Standardklassenbibliothek erreichen (aufgrund von Hosting-Einschränkungen). Ich weiß, dass es relativ einfach sein sollte, den Bildheader zu lesen und selbst zu analysieren, aber es scheint, dass so etwas bereits vorhanden sein sollte. Außerdem habe ich überprüft, dass der folgende Code das gesamte Bild liest (was ich nicht möchte):
using System;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Image img = new Bitmap("test.png");
System.Console.WriteLine(img.Width + " x " + img.Height);
}
}
}
c#
.net
image
image-manipulation
Jan Zich
quelle
quelle
Antworten:
Wie immer ist es am besten, eine gut getestete Bibliothek zu finden. Sie sagten jedoch, dass dies schwierig ist. Hier ist ein zwielichtiger, weitgehend ungetesteter Code, der für eine ganze Reihe von Fällen funktionieren sollte:
Hoffentlich ist der Code ziemlich offensichtlich. Um ein neues Dateiformat hinzuzufügen, fügen Sie es hinzu,
imageFormatDecoders
wobei der Schlüssel ein Array der "magischen Bits" ist, die am Anfang jeder Datei des angegebenen Formats erscheinen, und der Wert eine Funktion ist, die die Größe aus dem Stream extrahiert. Die meisten Formate sind einfach genug, der einzige echte Stinker ist JPEG.quelle
throw e;
sondern einfachthrow;
stattdessen. Ihre XML-Dokumentkommentare zum zweitenGetDimensions
zeigen auchpath
anstelle vonbinaryReader
Die
validateImageData
Einstellungfalse
verhindert , dass GDI + eine kostspielige Analyse der Bilddaten durchführt, wodurch die Ladezeit erheblich verkürzt wird. Diese Frage wirft mehr Licht auf das Thema.quelle
new Bitmap()
.Haben Sie versucht, die WPF Imaging-Klassen zu verwenden?
System.Windows.Media.Imaging.BitmapDecoder
, etc.?Ich glaube, es wurde versucht sicherzustellen, dass diese Codecs nur eine Teilmenge der Datei lesen, um die Header-Informationen zu ermitteln. Es ist einen Scheck wert.
quelle
Ich habe vor ein paar Monaten nach etwas Ähnlichem gesucht. Ich wollte den Typ, die Version, die Höhe und die Breite eines GIF-Bildes lesen, konnte aber online nichts Nützliches finden.
Glücklicherweise befanden sich im Fall von GIF alle erforderlichen Informationen in den ersten 10 Bytes:
PNG sind etwas komplexer (Breite und Höhe betragen jeweils 4 Byte):
Wie oben erwähnt, ist wotsit eine gute Seite für detaillierte Spezifikationen zu Bild- und Datenformaten, obwohl die PNG-Spezifikationen bei pnglib viel detaillierter sind. Ich denke jedoch, dass der Wikipedia-Eintrag in den Formaten PNG und GIF der beste Ausgangspunkt ist.
Hier ist mein ursprünglicher Code zum Überprüfen von GIFs. Ich habe auch etwas für PNGs zusammengestellt:
quelle
Basierend auf den bisherigen Antworten und einigen zusätzlichen Suchanfragen scheint es, dass in der .NET 2-Klassenbibliothek keine Funktionalität dafür vorhanden ist. Also habe ich beschlossen, meine eigenen zu schreiben. Hier ist eine sehr grobe Version davon. Im Moment brauchte ich es nur für JPGs. Damit ist die Antwort von Abbas vervollständigt.
Es gibt keine Fehlerprüfung oder andere Überprüfung, aber ich benötige sie derzeit für eine begrenzte Aufgabe, und sie kann eventuell einfach hinzugefügt werden. Ich habe es an einigen Bildern getestet und es liest normalerweise nicht mehr als 6 KB von einem Bild. Ich denke, es hängt von der Menge der EXIF-Daten ab.
quelle
Ich habe das für die PNG-Datei gemacht
quelle
Ja, Sie können dies absolut tun und der Code hängt vom Dateiformat ab. Ich arbeite für einen Imaging-Anbieter ( Atalasoft ), und unser Produkt bietet GetImageInfo () für jeden Codec, der das Minimum tut, um Dimensionen und einige andere leicht abrufbare Daten herauszufinden.
Wenn Sie Ihre eigenen Rollen erstellen möchten , empfehle ich, mit wotsit.org zu beginnen , das detaillierte Spezifikationen für nahezu alle Bildformate enthält. Sie werden sehen, wie Sie die Datei identifizieren und wo sich Informationen darin befinden.
Wenn Sie mit C vertraut sind, können Sie diese Informationen auch mit der kostenlosen JPEGLIB abrufen. Ich würde wetten, dass Sie dies mit .NET-Bibliotheken tun können, aber ich weiß nicht wie.
quelle
new AtalaImage(filepath).Width
etwas Ähnliches bewirkt?Atalasoft.Imaging.Codec.RegisteredDecoders.GetImageInfo ( fullPath ) .Size
Die Antwort von ICR wurde aktualisiert, um auch progressive jPegs und WebP zu unterstützen :)
quelle
Es wird vom Dateiformat abhängen. Normalerweise geben sie es in den frühen Bytes der Datei an. In der Regel wird dies bei einer guten Implementierung zum Lesen von Bildern berücksichtigt. Ich kann Sie jedoch nicht auf eine für .NET verweisen.
quelle