图像质量损失从何而来?

チーズ*_*ズパン 8 c# png image picturebox winforms

在我的Winforms应用程序中,它通过Linq连接到数据库到SQL我将图像(总是*.png)保存到一个如下所示的表:

CREATE TABLE [dbo].[Images] (
    [Id]       INT   IDENTITY (1, 1) NOT NULL,
    [Bild]     IMAGE NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
Run Code Online (Sandbox Code Playgroud)

在我可以存储图片之前,我必须将其转换byte[]为以及我是这样做的:

public static byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
    using (MemoryStream ms = new MemoryStream())
    {
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return ms.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,如果我想将这个相同的图像加载到我的应用程序中的PictureBox,我将使用此方法将其转换回来:

public static Image ByteArrayToImage(byte[] byteArrayIn)
{
    using (MemoryStream ms = new MemoryStream(byteArrayIn))
    {
        Image returnImage = Image.FromStream(ms);
        return returnImage;
    }
}
Run Code Online (Sandbox Code Playgroud)

它确实有效,当我尝试在Picturebox中显示数据库中的图像时,会出现唯一的问题.

所以当我将这个Image加载到数据库时:

在此输入图像描述

后来我尝试显示它.它突然看起来像这样:

在此输入图像描述

我已经尝试了PictureBox的所有可能的SizeMode设置(Normal,Stretchimage,AutoSize,CenterImage,Zoom),它仍然看起来像这样.

以下是我如何将图像从数据库加载到pictureBox:

首先,我通过id检索属于集合的所有图像:

public static ImageList GetRezeptImages(int rezeptId) 
{
    using (CookBookDataContext ctx = new CookBookDataContext(ResourceFile.DBConnection))
    {
        IEnumerable<RezeptBilder> bilder = from b in ctx.RezeptBilders where b.FKRezept == rezeptId select b;
        ImageList imageList = new ImageList();

        foreach(RezeptBilder b in bilder)
        {
            imageList.Images.Add(Helper.ByteArrayToImage(b.Bild.ToArray()));
        }

        return imageList;                
    }
}
Run Code Online (Sandbox Code Playgroud)

同样在我的应用程序中,我有一个datagridview,其中Id存储在第一列中.因此,当我想要检索属于该集合的任何图像时,我这样做:

private void dgvRezeptListe_CellClick(object sender, DataGridViewCellEventArgs e)
{
    pbRezeptBild.Image = DBManager.GetRezeptImages(Int32.Parse(dgvRezeptListe.SelectedRows[0].Cells[0].Value.ToString())).Images[0];      
}
Run Code Online (Sandbox Code Playgroud)

从本地目录加载时,Image在pictureBox中看起来很好.我还尝试将初始图片转换为二进制并返回(不加载到数据库),它在pictureBox中显示时看起来仍然很好.

在调试来自数据库的Image时,我发现了其他一些东西.在查看ImageSize时,宽度和高度都具有值16.这很奇怪,因为原始图像具有完全不同的尺寸.

有任何想法吗?

Ber*_*nde 7

ImageList当您将图像添加GetRezeptImages到列表中时,它似乎正在将图像转换为MemoryBmp .
我不知道为什么会这样做,但这就是你在图像中失去质量的原因.正如您也意识到的那样,图像被转换为​​16x16图像,然后当您PictureBox将图像调整为原始尺寸时,它看起来更加俗气.

编辑:
来自TaW的评论:ImageList集合无法处理不同大小的图像,因此它将所有图像转换为通用大小.由于没有设置大小,它似乎默认为16x16.

我建议您更改GetRezeptImages方法以返回a List<Image>而不是a ImageList并相应地使用它来显示图像.

或者,如果您始终GetRezeptImages以与问题中显示的方式相同的方式使用该方法,则可以将其更改为始终只返回Image对象中的第一个图像并完全丢弃所有列表.

  • 我会说它看起来不那么俗气. (3认同)