字节数组转换为图像

135

我想将一个字节数组转换为图像。

这是从数据库中获取字节数组的代码:

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;
}
当我到达一行带有注释的代码时,就会出现下面的异常:参数无效。 我该如何修复引起此异常的问题?

你检查过查询中的图像字节是否有效吗?你可以使用File.WriteAllBytes("myimage.jpg", byteArrayIn)进行验证。 - Holstebroe
你想要接受其中一个答案吗? 当有人回答我的问题时我该怎么做? - Andrew Morton
14个回答

2
你没有声明returnImage为任何类型的变量 :)
这应该能帮到你:
public Image byteArrayToImage(byte[] byteArrayIn)
{
    try
    {
        MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
        ms.Write(byteArrayIn, 0, byteArrayIn.Length);
        Image returnImage = Image.FromStream(ms,true);
    }
    catch { }
    return returnImage;
}

1
代码作为一个想法很有用,但当然不能按照原样运行。returnImage必须在try/catch部分之外声明。同时,在'catch'中必须实例化returnImage - 我创建了一个单像素位图:var image = new Bitmap(1, 1); MemoryStream stream = new MemoryStream(); image.Save(stream, ImageFormat.Jpeg); stream.Position = 0; - Reid

1
大多数情况下,这种情况是由于SQL列中存在错误数据所致。以下是将图像插入到列中的正确方法:
INSERT INTO [TableX] (ImgColumn) VALUES (
(SELECT * FROM OPENROWSET(BULK N'C:\....\Picture 010.png', SINGLE_BLOB) as tempimg))

大多数人错误地这样做:

Most people do it incorrectly this way:

INSERT INTO [TableX] (ImgColumn) VALUES ('C:\....\Picture 010.png'))

0

我建议使用ImageSharp

Image<Bgra32> image = SixLabors.ImageSharp.Image.LoadPixelData<Bgra32>
                        (byteArray
                        , pageWidth
                        , pageHeight);

0
首先安装此软件包: Install-Package SixLabors.ImageSharp -Version 1.0.0-beta0007
[SixLabors.ImageSharp][1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp 然后使用以下代码将字节数组转换为图像:
Image<Rgba32> image = Image.Load(byteArray); 

获取图像格式,请使用下面的代码:
IImageFormat format = Image.DetectFormat(byteArray);

使用以下代码进行图像变异:
image.Mutate(x => x.Resize(new Size(1280, 960)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接