Я хочу преобразовать байтовый массив в изображение.
Это код моей базы данных, откуда я получаю массив байтов:
public void Get_Finger_print()
{
try
{
using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
{
thisConnection.Open();
string query = "select pic from Image_tbl";// where Name='" + name + "'";
SqlCommand cmd = new SqlCommand(query, thisConnection);
byte[] image =(byte[]) cmd.ExecuteScalar();
Image newImage = byteArrayToImage(image);
Picture.Image = newImage;
//return image;
}
}
catch (Exception) { }
//return null;
}
Мой код конверсии:
public Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Write(byteArrayIn, 0, byteArrayIn.Length);
returnImage = Image.FromStream(ms,true);//Exception occurs here
}
catch { }
return returnImage;
}
Когда я дойду до строки с комментарием, возникает следующее исключение: Parameter is not valid.
Как я могу исправить то, что вызывает это исключение?
c#
arrays
byte
bytebuffer
Танзил ур Рахман
источник
источник
Ответы:
Вы дважды записываете в свой поток памяти, а также не удаляете поток после использования. Вы также просите декодер изображения применить встроенную цветокоррекцию.
Попробуйте вместо этого:
источник
Возможно, мне что-то не хватает, но для меня этот однострочный файл отлично работает с массивом байтов, который содержит изображение файла JPEG.
РЕДАКТИРОВАТЬ:
См. Здесь обновленную версию этого ответа: Как преобразовать изображение в массив байтов
источник
источник
Хочу отметить, что в решении @ isaias-b есть ошибка.
Это решение предполагает, что
stride
это равно длине строки. Но это не всегда так. Из-за выравнивания памяти, выполняемого GDI, шаг может быть больше длины строки. Это нужно учитывать. В противном случае будет сгенерировано неверное смещенное изображение. Байты заполнения в каждой строке игнорируются.Фиксированный код:
Чтобы проиллюстрировать, к чему это может привести, давайте сгенерируем
PixelFormat.Format24bppRgb
градиентное изображение 101x101:Если мы скопируем весь массив как есть по адресу, указанному
bmpData.Scan0
, мы получим следующее изображение. Смещение изображения из-за того, что часть изображения была записана в байты заполнения, это было проигнорировано. Также поэтому последняя строка неполная:Но если мы скопируем указатель назначения с построчным смещением по
bmpData.Stride
значению, будет сгенерирован действительный образ:Шаг также может быть отрицательным:
Но с такими изображениями я не работал, и это выходит за рамки моего пояснения.
Связанный ответ: C # - RGB Buffer из Bitmap, отличный от C ++
источник
Все представленные ответы предполагают, что байтовый массив содержит данные в представлении известного формата файла, например: gif, png или jpg. Но недавно у меня возникла проблема с попыткой эффективно преобразовать
byte[]
s, содержащие линеаризованную информацию BGRA, вImage
объекты. Следующий код решает эту проблему с помощьюBitmap
объекта.Это небольшая вариация решения, размещенного на этом сайте .
источник
есть простой подход, как показано ниже, вы можете использовать
FromStream
метод изображения, чтобы сделать трюк, просто не забудьте использоватьSystem.Drawing
;источник
попробуйте (ОБНОВЛЕНИЕ)
источник
Вы не объявили returnImage как какую-либо переменную :)
Это должно помочь:
источник
Это вдохновлено ответом Холстебро, а также комментариями здесь: Получение объекта Image из байтового массива
источник
Один лайнер:
источник
В большинстве случаев это плохие данные в столбце SQL. Это правильный способ вставки в столбец изображения:
Большинство людей делают это неправильно:
источник
[SixLabors.ImageSharp] [1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp
источник