我有一个存储在数据库中的图像的字节数组。我想创建一个Image对象,创建几个不同尺寸的图像,并将它们存储回数据库(保存回一个字节数组)。
我不担心数据库部分或调整大小的部分。但是是否有一种简单的方法可以加载Image对象而不必将文件保存到文件系统,然后在完成调整大小后将其放回字节数组中?如果可以,我希望全部在内存中完成。
Something like:
Image myImage = new Image(byte[]);
or
myImage.Load(byte[]);
byte[] bytes;
...
using (var ms = new System.IO.MemoryStream(bytes)) {
using(var img = Image.FromStream(ms)) {
...
}
}
byte[]
中的图像执行转换,然后将结果作为另一个byte[]
返回。public byte[] TransformImage(byte[] imageData)
{
using(var input = new MemoryStream(imageData))
{
using(Image img = Image.FromStream(input))
{
// perform your transformations
using(var output = new MemoryStream())
{
img.Save(output, ImageFormat.Bmp);
return output.ToArray();
}
}
}
}
byte[]
,执行所需的任何转换,然后返回一个新的byte[]
,可以重新存储回数据库。只回答问题的前半部分:这是一个一行代码的解决方案,对于包含JPEG文件图像的字节数组,我使用它效果很好。
Image x = (Bitmap)((new ImageConverter()).ConvertFrom(jpegByteArray));
编辑: 以下是稍微高级一点的解决方案:https://dev59.com/Mm865IYBdhLWcg3wduaH#16576471
我觉得把这个作为答案加进来会更加显眼。
并将它保存回一个字节数组中:
public Image localImage;
public byte[] ImageBytes;
public FUU_Image(byte[] bytes)
{
using (MemoryStream ImageStream = new System.IO.MemoryStream(bytes))
{
localImage = Image.FromStream(ImageStream);
}
localImage = ResizeImage(localImage);
using (MemoryStream ImageStreamOut = new MemoryStream())
{
localImage.Save(ImageStreamOut, ImageFormat.Jpeg);
ImageBytes = ImageStreamOut.ToArray();
}
}