Как я могу прочитать байт [] из базы данных и преобразовать его в изображение? - PullRequest
4 голосов
/ 31 августа 2009

У меня есть хранимая процедура, которая возвращает данные типа varbinary (max). Я хочу преобразовать эти данные в изображение.

Но у меня проблемы с этой строкой:

public Image CargarAvatar(string login)
        {
            System.Object[] Args = new System.Object[1];
            Args[0] = login;

            DataTable X = new DataTable();
            X = TraerDataTable("sp_CargarAvatarUsuario", Args);

            byte[] ImagemByte = Convert.to (X.Rows[0][0].ToString());


            MemoryStream ms = new MemoryStream();
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

Пожалуйста, помогите! : D

Ответы [ 4 ]

11 голосов
/ 31 августа 2009

Поле varbinary возвращается в виде байтового массива, поэтому вам нужно только привести его:

byte[] ImagemByte = (byte[])X.Rows[0][0];

Затем вы используете массив для создания потока памяти:

MemoryStream ms = new MemoryStream(ImagemByte);
0 голосов
/ 18 сентября 2013

это для преобразования изображения в байтовый массив, его можно вставить в базу данных следующим образом:

public byte[] imageToByteArray(BitmapImage myimage)
    {
        MemoryStream ms = new MemoryStream();
        WriteableBitmap wb = new WriteableBitmap(myimage);
        wb.SaveJpeg(ms, myimage.PixelWidth, myimage.PixelHeight, 0, 100);
        byte[] imageBytes = ms.ToArray();
        return imageBytes;
    }

и это для обратного пути:

public static BitmapImage ByteArraytoBitmap(Byte[] byteArray)
    {
        MemoryStream stream = new MemoryStream(byteArray);
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.SetSource(stream);
        return bitmapImage;
    }
0 голосов
/ 31 августа 2009

Вы пытаетесь создать изображение из пустого потока памяти. Передайте байтовый массив в качестве параметра конструктору MemoryStream:

MemoryStream ms = new MemoryStream(ImagemByte);
0 голосов
/ 31 августа 2009

Я не уверен насчет преобразования Int в байт [] в этом случае, поскольку я нигде не вижу int. Это, конечно, можно сделать, я просто не вижу приложения в этом случае.

У тебя было две настоящие проблемы. Один создавал байт [], который, очевидно, вы знаете, поскольку он не будет компилироваться. Второй получал эти байты в поток.

public Image CargarAvatar(string login)
{
    System.Object[] Args = new System.Object[1];
    Args[0] = login;

    DataTable X = TraerDataTable("sp_CargarAvatarUsuario", Args); // No need to create a new DataTable and overwrite it with the return value of TraerDataTable. One assignment will do.

    byte[] ImagemByte = (byte[])X.Rows[0][0]; // If this is an Image in the database, then this is already a byte[] here and just needs to be casted like so.             

    MemoryStream ms = new MemoryStream(ImagemByte); // You need to pass the existing byte[] into the constructor of the stream so that it goes against the correct data
    Image returnImage = Image.FromStream(ms);

    return returnImage;
}
...