チーズ*_*ズパン 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.这很奇怪,因为原始图像具有完全不同的尺寸.
有任何想法吗?
ImageList当您将图像添加GetRezeptImages到列表中时,它似乎正在将图像转换为MemoryBmp .
我不知道为什么会这样做,但这就是你在图像中失去质量的原因.正如您也意识到的那样,图像被转换为16x16图像,然后当您PictureBox将图像调整为原始尺寸时,它看起来更加俗气.
编辑:
来自TaW的评论:ImageList集合无法处理不同大小的图像,因此它将所有图像转换为通用大小.由于没有设置大小,它似乎默认为16x16.
我建议您更改GetRezeptImages方法以返回a List<Image>而不是a ImageList并相应地使用它来显示图像.
或者,如果您始终GetRezeptImages以与问题中显示的方式相同的方式使用该方法,则可以将其更改为始终只返回Image对象中的第一个图像并完全丢弃所有列表.