【发布时间】:2014-12-24 01:51:39
【问题描述】:
在通过 Linq to SQL 连接到数据库的 Winforms 应用程序中,我将图像(总是 *.png)保存到如下所示的表中:
CREATE TABLE [dbo].[Images] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Bild] IMAGE NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
在我可以存储图片之前,我必须将其转换为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();
}
}
之后,如果我想在我的应用程序中将相同的图像加载到 PictureBox 中,我会使用以下方法将其转换回来:
public static Image ByteArrayToImage(byte[] byteArrayIn)
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
{
Image returnImage = Image.FromStream(ms);
return returnImage;
}
}
它确实有效,唯一的问题是当我尝试在图片框中显示数据库中的图像时出现。
所以当我将此图像加载到数据库时:
稍后我尝试显示它。突然变成这样:
我已经为 PictureBox 尝试了所有可能的 SizeMode 设置(Normal、Stretchimage、AutoSize、CenterImage、Zoom),它仍然看起来像这样。
这也是我如何将图像从数据库加载到图片框:
首先我通过 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;
}
}
另外,在我的应用程序中,我有一个 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];
}
从本地目录加载时,图片在图片框中看起来很好。我还尝试将初始图片转换为二进制并返回(不将其加载到数据库中),在图片框中显示时看起来仍然很好。
在调试来自数据库的图像时,我还意识到了其他一些事情。查看 ImageSize 时,宽度和高度的值都为 16。这很奇怪,因为原始图像的尺寸完全不同。
有什么想法吗?
【问题讨论】:
-
据此来源:msdn.microsoft.com/de-de/library/ms187993.aspx,图像类型已弃用,应替换为 varbinary。也许这也可以防止您的质量损失。
-
我刚刚测试了您将图像转换为字节并再次转换回来的两种方法,使用正常的数据集,与您定义和附加的存储过程相同的表,并且图像没有质量损失。似乎您的问题可能在
LINQ to SQL -
我现在也尝试了
LINQ to SQL和varbinary(max)并且也没有质量损失。您能否显示从源代码加载图像并加载到图片框的代码?似乎问题可能与您的存储方式无关 -
图片在这行代码
imageList.Images.Add(Helper.ByteArrayToImage(b.Bild.ToArray()));上被转换成Icon,我还在想为什么:) -
嗯,这说明了一切。 imageList 非常适合它的功能。但它不能做的是您可能需要的:存储不同大小的图像。您可以并且应该设置它的 Imagesize 和 bitDepth 属性,但如果您的图像具有不同的大小,则不能使用它。如果他们不只是修复 ImageList 并且您已经设置好了!否则用 List
或 List 替换它!
标签: c# image winforms png picturebox