Laden...

Bitmap ImageFormat ändern

Erstellt von Lost-Ha(n)f-PHP vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.296 Views
Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 14 Jahren
Bitmap ImageFormat ändern

Hallo Leute,

ich würde gerade in einemBitmap-Object das ImageFormat ändern. Ich habe bis jetzt allerdings nur dir Möglichkeit gefunden beim Aufruf von Save() ImageFormat als Parameter anzugeben. Welche Möglichkeiten gibt es noch, um das Format zu ändern? Der Grund dafür ist, dass das Bild (FileSize) kleiner werden soll.

Anmerkung:
Ich brauche diees Object später nicht als Datei, da ich es serialisiere und transferiere. Von daher möchte ich nicht erst das Bild in anderem Format speichern und dann wieder laden.

Habt ihr da eine Idee?

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

1.361 Beiträge seit 2007
vor 14 Jahren

Hi,

bei Image.Save kannst du ja auch einen Stream übergeben.
Und damit auch einen MemoryStream.

Es muss also nicht erst auf die Festplatte.

Und in dem Memorystream wäre es dann damit ja auch schon serialisiert.

beste Grüße
zommi

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 14 Jahren

Danke, mir war durchaus bewusst, dass Save auch in einen Stream funktioniert. Allerdings wuste ich nicht, dass das Object dann darin serialisiert wird.

Vielen Dank!

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 14 Jahren

Ich hänge da schon wieder etwas. Ich habe das ganze nun in einem MemoryStream:


MemoryStream ms = new MemoryStream();
Bitmap.Save(ms, ImageFormat.Png);

Das Problem ist nun, dass ich das ganze eigentlich so verschicke:


NetworkStream ns = new NetworkStream(_Socket);

In diesen Stream serialisiere ich ein Transport-Objekt, das in etwas folgenden Konstruktor hat:


Transporter(string cmd, object Object);

Dem Transporter übergebe ich dann mein Bitmap und füge noch einen Command hinzu, denn ich zwingend benötige. Das ganze wird in serialisiert und über ns verschickt. Wenn ich jetzt aber mein Bitmal in dem ms habe, wie komme ich das ganze dann in oben genannte Form? Kann man vielleicht das Bild beim Save() als String ausgeben? Oder fällt euch zufällig etwas anderes ein?

Ich möchte nicht den ms als Objekt einbinden und das ganze dann erneut serialisieren, wenn es nicht die einige Möglichkeit der Übertragung ist.

Ich bin für Ideen dankbar.

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

J
237 Beiträge seit 2008
vor 14 Jahren

Wenn du den MemoryStream beschrieben hast:

  • Das alte Bitmap disposen
  • Der Variablen mit Bitmap.FromStream(myMemoryStream) das neue Bitmap-Objekt zuweisen.
  • Dem object-Parameter übergeben

Allerdings hast du dann den doppelten Aufwand (2x serialisieren).
Alternativ könntest du den MemoryStream nicht in ein Bitmap sondern in ein byte[] lesen und diesen verschicken. byte[] wird ja beim serialisieren einfach so genommen und verschickt, oder? Beim Empfänger kannst du aus dem byte[] dann wieder ein Bitmap machen.

Grüße, JasonDelife.

Beim Programmieren löst man die Probleme, die man nicht hätte, programmierte man nicht.

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 14 Jahren

Danke auf das gleich bin ich gerade auch gekommen ^^

Die Lösung mit dem Byte[] funktioniert super.


MemoryStream ms = new MemoryStream();
Bitmap.Save(ms, ImageFormat.Png);

byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
...

Falls das jemand mal benötigen sollte.

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

3.971 Beiträge seit 2006
vor 14 Jahren

Dispose (von Bitmap und MemoryStream) nicht vergessen!

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...