Umwandeln Byte-Array in Bild: der Parameter ist nicht gültig
Ich bin die Speicherung von Bildern in einer Datenbank und möchte konvertieren von byte-array auf dem Bild. Ich habe kein problem, konvertieren eines Objekts in byte-array, aber ich bekomme eine Fehlermeldung "der Parameter ist ungültig", wenn Sie versuchen, zu konvertieren von byte-array auf dem Bild. Das Objekt bin ich vorbei, um meine Methode aus einem Datensatz Zeile.
Gespeicherte Prozedur
USE [----------------]
GO
/****** Object: StoredProcedure [dbo].[usp_imageloader_add_test] Script Date: 01/16/2012 09:19:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[usp_imageloader_add_test]
@p_Image Image
as
INSERT into Test_Images VALUES(@p_Image)
Datei hochladen control /Sicherungsdatei konvertieren aus dem byte-array und speichern Sie Daten in die Datenbank
protected void btnUpload_Click(object sender, EventArgs e)
{
if (ctrlUpload.PostedFile != null)
{
if (ctrlUpload.PostedFile.ContentLength > 0)
{
//Get Posted File
HttpPostedFile objHttpPostedFile = ctrlUpload.PostedFile;
//Find its length and convert it to byte array
int ContentLength = objHttpPostedFile.ContentLength;
//Create Byte Array
byte[] bytImg = new byte[ContentLength];
//Read Uploaded file in Byte Array
objHttpPostedFile.InputStream.Read(bytImg, 0, ContentLength);
using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db))
{
try
{
string sql = "usp_imageloader_add_test";
SqlCommand cmd = new SqlCommand(sql, dbConnection);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@p_Image", bytImg).SqlDbType = SqlDbType.Image;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
catch (Exception ex)
{
ex.Message.ToString();
}
}
}
}
}
Konvertieren Objekt aus dem byte-array und Bild
private System.Drawing.Image ObjToImg(object obj)
{
byte[] byteArray;
if (obj == null)
return null;
else
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, obj);
byteArray = ms.ToArray(); //Byte Array
ms.Close();
ms = new MemoryStream(byteArray, 0, byteArray.Length);
ms.Seek(0, SeekOrigin.Begin);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
return returnImage;
}
Irgendwelche Ideen wäre hilfreich.
stackoverflow.com/a/6712677/284240 speichern Sie die Binärdaten in eine Datei und sehen Sie, wie ein Bild-editor reagiert
InformationsquelleAutor nick gowdy | 2012-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Image.FromStream
ist wahrscheinlich werfen eineArgumentException
weil das Bild-format ist ungültig. Sie erwartet eine zufällige serialisiertes Objekt formatiert werden, wie ein gültiges Bild ist nicht zumutbar.Sie sollte nicht mit der Serialisierung an alle, macht es keinen Sinn. Wenn der parameter kam von der Datenmenge sollte es bereits ein array vom Typ byte.
InformationsquelleAutor insipid
Ist die Daten, die Sie mit raw die RGB-Daten? Wenn dem so ist, gibt es ein user-Kommentar in der Dokumentation für FromStream (), die erwähnt, dass die Methode werfen, wenn der stream enthält raw die RGB-Daten: http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx (siehe unten auf der Seite); es empfiehlt die Verwendung einer Bitmap statt (http://msdn.microsoft.com/en-us/library/zy1a2d14.aspx).
InformationsquelleAutor atkretsch
Versuchen Sie Folgendes, Ihr stream kann nicht initialisiert werden zum Anfang:
Welche Art von Bild ist es? Sind Sie sicher, dass das Bild, das gespeichert ist, gültig ist?
Auch nur ein Kommentar auf die Nutzung (wirkt sich nicht auf dein Problem), es ist eine gute Praxis, verwenden Sie eine
using
- Anweisung bei der Arbeit mit streams. Eg:Ok ich werde das versuchen und sehen, ob es funktioniert.
Ich veränderte den code einige den stream verweist auf den Anfang, bevor Sie versuchen, ziehen Sie das Bild aus dem memorystream und es immer noch wirft den gleichen Fehler.
gowdy, Welche Art von Bild ist es? Haben Sie sichergestellt, dass das Bild, das gespeichert ist, gültig ist?
InformationsquelleAutor Kelsey
Die Lösung von Kelsey funktionieren sollte. Dies ist, weil, wenn Sie Lesen Daten aus dem byteArray -, Speicher-stream, der Zeiger ist am Ende des Baches, und jetzt, wenn Sie versuchen das Lesen von Daten aus diesem Speicher-stream, es versucht zu Lesen, head of diese Zeiger, und da es keine Daten nach diesem, erhalten Sie eine Fehlermeldung. Nun, wenn Sie
ms.Seek(0, SeekOrigin.Begin);
der Leser Zeiger auf den Beginn des Speicher-stream. Und entsorgen Sie die Speicher-stream, wenn Sie fertig sind es zu benutzenms.Dispose()
. Hoffe, das hilft.InformationsquelleAutor Amar Palsapure
Brauchen Sie nicht die binary-formatter, das ist es, was die Unordnung mit Ihren Daten, die zum serialisieren von Objekten wirklich.
Die wichtige Sache zu beachten ist, dass das Objekt ein byte-array kann man schon so einfach wirken und verwenden Sie diesen.
Versuchen Sie dies:-
InformationsquelleAutor