| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

ich habe folgendes Problem. Ich muss ein PNG Byte Array in ein JPG Byte Array konvertieren. Das ganze soll ohne Speichern auf die Festplatte geschehen. Also nichts wie:

bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters);


Im Grunde suche ich folgendes:
byte[] pngArray = //irgendein Bild;
byte[] jpgArray = ConvertPngToJpg(pngArray);

Das kann ja nun nicht wirklich so schwierig sein, allerdings stehe ich da gerade ziemlich auf dem Schlauch.

Gruß und danke
Andy
22.08.2011
cruX 803 1 1 9
3 Antworten
5
byte[] pngArray = //irgendein Bild;

//Byte-Array in Stream umwandeln
MemoryStream msPng = new MemoryStream();
msPng.Write(myByte, 0, myByte.Length);

//MemoryStream einlesen
Image img = Image.FromStream(msPng);

//Ausgabestream erzeugen
MemoryStream msJpeg = new MemoryStream();

//Bild konvertieren und in Ausgabestream schreiben
img.Save(msJpeg, ImageFormat.Jpeg);

//Byte-Array aus Ausgabestream erzeugen
byte[] jpgArray = msJpeg.ToArray();
22.08.2011
Floyd 14,6k 3 9
Sußer, danke! Das entspricht (fast) dem, was ich erstellt habe. Nur ist es kürzer ;)
Danke
cruX 22.08.2011
2
Der MemoryStream hat eine Ctor-Überladung der direkt das byte[] migegeben werden kann - ist ganz praktisch. => msPng = new MemoryStream(pngArray);
Und IDisposalbe implementiert er auch, also sollte using verwendet werden.
;-)
gfoidl 22.08.2011
2
Ich hab es schon selbst gelöst ;)
Ich wusste doch, dass es nicht so schwierig sein kann :)

Für alle, die es auch brauchen, hier mein Code:
private static byte[] ConvertPngToJpg(byte[] pngByteArray)
{
MemoryStream pngStream = new MemoryStream(pngByteArray);
Image returnImage = Image.FromStream(pngStream);
MemoryStream jpgStream = new MemoryStream();
returnImage.Save(jpgStream ,ImageFormat.Jpeg);
byte[] returnValue = StreamToByteArray(jpgStream);

return returnValue;
}

// This Code is from http://stackoverflow.com/questions/1080442/how-to-convert-an-stream-into-a-byte-in-c
public static byte[] StreamToByteArray(Stream stream)
{
long originalPosition = stream.Position;
stream.Position = 0;

try
{
byte[] readBuffer = new byte[4096];

int totalBytesRead = 0;
int bytesRead;

while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
{
totalBytesRead += bytesRead;

if (totalBytesRead == readBuffer.Length)
{
int nextByte = stream.ReadByte();
if (nextByte != -1)
{
byte[] temp = new byte[readBuffer.Length * 2];
Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
readBuffer = temp;
totalBytesRead++;
}
}
}

byte[] buffer = readBuffer;
if (readBuffer.Length != totalBytesRead)
{
buffer = new byte[totalBytesRead];
Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
}
return buffer;
}
finally
{
stream.Position = originalPosition;
}
}


Gruß
Andy
22.08.2011
cruX 803 1 1 9
Die MemoryStream.ToArray-Methode gefiehl dir wohl nicht :D (Siehe mein Beispiel :D)
Floyd 22.08.2011
1
Doch ist wesentlich übersichtlicher. Habs schon eingebaut :)
cruX 22.08.2011
2
Suber, dank eurer Hilfe sieht die Methode nun so aus:

/// <summary>
/// Convert a png byte-array to jpg byte-array
/// </summary>
/// <param name="pngByteArray">png image as byte[]</param>
/// <returns></returns>
public static byte[] ConvertPngToJpg(byte[] pngByteArray)
{
Image img;
using (MemoryStream msPng = new MemoryStream(pngByteArray))
{
img = Image.FromStream(msPng);
}

byte[] jpgArray;
using (MemoryStream msJpeg = new MemoryStream())
{
img.Save(msJpeg, ImageFormat.Jpeg);
jpgArray = msJpeg.ToArray();
}

return jpgArray;
}


Danke, es hat mir sehr geholfen
Andy
22.08.2011
cruX 803 1 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH