Frage

Ich habe ein seltsames Problem - ich habe etwa 14,5 Millionen Bitmap-Bilder, die angeblich unkomprimiert sind. Ich brauche diese Bitmaps in JPG-Dateien und speichert sie in einer Datenbank zu konvertieren.

Als ich die Klassen in der Bibliothek .NET System.Drawing bereitgestellt verwenden, um die Bitmap als ImageFormat.Jpeg zu speichern, ist die resultierende JPEG ist über zweimal die Größe des ursprünglichen Bitmap. Hier ist der Code:

byte[] bitmapBytes = //get from the db
using(MemoryStream bitmapStream = new MemoryStream(bitmapBytes))
{
   using(Bitmap bitmap = (Bitmap)Bitmap.FromStream(bitmapStream))
   {
       bitmap.Save("jpg.jpg", ImageFormat.Jpeg);
   }
}

Ich habe durch den HEX mehrerer dieser Bilder sah, und es sieht aus wie die Kompressionseinstellung ist „none“. Also ich gehe davon aus sie unkomprimiert sind. Darüber hinaus den „BMP“ Code die HEX für die ursprüngliche Datei hat und die resultierende Datei hat den „JFIF“ Code wie man erwarten würde.

Die Bilder sind schwarz und weiß, keine Farben.

Alle Gedanken, warum dies geschehen würde? Suche nach Zeiger in die richtige Richtung ...

Edits:

  • Ich habe versucht, die alternative Überlastung mit speichern, mit dem Sie die Qualität angeben. Kein Vorteil gesehen.
  • Ich soll auch angeben, dass ich bin ein bisschen mit JPEG bis zu einem gewissen Grad hier stecken. Dies ist ein Legacy-System und andere Teile des Systems erwarten JPEG.

Bild-Attribut:

  • Bitmap Dimensionen: 152x48
  • Bitmap Dateigröße: 1022 Bytes
  • JPEG: gleiche Dimension
  • JPEG Größe: 2,2 kb
  • Bitmap Info: Indexed, 1 Schicht (2 Farben)
  • Bitmap-Auflösung: 96.012x 96,012 ppi
War es hilfreich?

Lösung

Es ist wahrscheinlich, weil die JPEG-Bilder Sie sind jetzt 24-Bit-RGB-Farbbilder speichern, wo die Bitmaps sind 1 bpp Schwarz-Weiß-Bilder.

Wenn die Bitmaps 1 bpp sind, JPEG ist wahrscheinlich nicht das beste Format, um sie zu konvertieren.

Andere Tipps

Schwarz-Weiß oder Graustufen?

http://www.faqs.org/faqs /compression-faq/part2/section-6.html :

"JPEG arbeitet entweder auf Vollfarbe oder Graustufenbilder, es nicht handhaben Bi-Level (schwarz und weiß) Bilder, bei nicht gut am wenigsten. Dabei spielt es keine handhaben colormapped Bilder entweder; Sie müssen diese in einem nicht zugeordneten Vormaximierung Vollfarbdarstellung. JPEG funktioniert am besten auf „Dauerton“ Bilder. Bilder mit vielen plötzlichen Sprüngen in Farbwert nicht gut komprimieren. "

Sie müssen ein Attribut für den Geber ihm die Komprimierungsstufe zu sagen, zu verwenden.

Siehe auch

Sie werden noreferrer"> dieser Überlastung von Bitmap.Save zur Verwendung von Encoder .

Wie, warum Ihre Dateien werden immer größer, kann es sein, dass Ihre BMP Länge codiert wurde ausgeführt, oder einen kleineren (nicht 24 Bit) Bitmap verwendet wird.

Ein Vergleich der Größen für eine Farbe 2 61x64 Bild:

  • Fax-4 tiff: 268 Bytes
  • 2 Farbe bmp (wie oben): 550 Bytes
  • 8-Bit-JPEG: 1502 Bytes
  • 32-Bit-JPEG (wie System.Drawing würde erstellen): 2015 Bytes

Also, wenn Sie JPEG-Dateien verwenden müssen, wandeln sie zuerst auf 8 Bit. Dadurch, dass in .Net wird schwierig sein, aber es ist verfügbar Beispielcode auf Codeproject und andere.

Ich wollte nur mit meiner Lösung followup. Ich konnte den Rest des Systems erhalten, PNG-Format Grafiken zu unterstützen, also was ich tat, war die Bitmaps in PNG-Grafiken konvertieren, und mache sie 1 Bit pro Pixel schwarz und weiß. Das machte sie klein und effizient.

Also das Problem war, dass JPGs einfach nicht wenige Farben Bilder tun gut.

Nur ein Gedanke: Sie sagen, Teil des Systems die Dateien benötigt JPEG-Dateien zu sein. Ist das wirklich wahr oder braucht es nur die Dateien, die JPG-Erweiterung zu haben? Wenn ja, man könnte - obwohl es hässlich ist - so benennen Sie die Dateierweiterung, da die BMP-Dateien in Ihrem Fall kleiner sind.

Zum Beispiel in Windows können Sie eine BMP-Datei nehmen und es ist Erweiterung JPG ändern, wenn Sie es öffnen, wird Windows nicht kümmern und zeigt es richtig.

Dieses Kbartikel sollte Ihnen zeigen, wie es tun

http://support.microsoft.com/kb/324790

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top