Используя C #, есть ли лучший способ преобразовать Windows Bitmap
в a, byte[]
чем сохранить во временный файл и прочитать результат, используя FileStream
?
233
Есть несколько способов.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Это удобно, потому что не требует много кода.
Поток памяти
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Этот эквивалентен тому, что вы делаете, за исключением того, что файл сохраняется в памяти, а не на диск. Хотя больше кода у вас есть опция ImageFormat, и ее можно легко изменить между сохранением в памяти или на диске.
ImageConverter
метод сохранит изображение в формате Png, что приведет к огромным файлам.ImageConverter
не соответствует стандарту .net, который вы можете использоватьMemoryStream
MemoryStream может быть полезным для этого. Вы можете поместить его в метод расширения:
Вы можете просто использовать это как:
Я частично не согласен с ответом Prestomanifto относительно ImageConverter. Не используйте ImageConverter. В этом нет ничего технически неправильного, но просто тот факт, что он использует упаковку / распаковку из объекта, говорит мне, что это код из старых темных мест .NET Framework, и он не идеален для использования с обработкой изображений (это избыточно для преобразования в байт [] по крайней мере), особенно если учесть следующее.
Я взглянул на
ImageConverter
код, используемый .Net Framework, и внутри он использует код, почти идентичный тому, который я предоставил выше. Он создает новыйMemoryStream
, сохраняетBitmap
в любом формате, в котором он был, когда вы его предоставили, и возвращает массив. Пропустить дополнительные затраты на созданиеImageConverter
класса с помощьюMemoryStream
источник
Вы также можете просто Marshal.Copy данных растрового изображения. Нет промежуточного потока памяти и т. Д. И быстрая копия памяти. Это должно работать как для 24-битных, так и для 32-битных битовых карт.
,
источник
Сохраните изображение в MemoryStream и затем захватите байтовый массив.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
источник
System.Drawing.Image
(см .: docs.microsoft.com/en-us/dotnet/api/… )System.Drawing.Image does not exist
. Так что .. нет, не работает :(Используйте
MemoryStream
вместо aFileStream
, вот так:источник
ToArray
, нетGetBuffer
.Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method.
Итак, теперь массив байтов fromGetBuffer
будет возвращать изображение плюс неиспользуемые байты, что, вероятно, приведет к повреждению изображения.Попробуйте следующее:
Убедитесь, что вы используете:
источник
Я полагаю, вы можете просто сделать:
источник
источник
Более простой:
источник
Очень просто использовать это только в одной строке:
источник