在我的Winforms应用程序中,通过Linq to SQL连接到数据库后,我将图像(始终为*.png格式)保存到一个如下所示的表中:
它实际上是有效的,唯一的问题出现在我尝试在Picturebox中显示来自数据库的图片时。
因此,当我将此图像加载到数据库中时:
稍后我尝试显示它。它突然看起来像这样:
我已经尝试了PictureBox的所有可能的SizeMode设置(Normal、Stretchimage、AutoSize、CenterImage、Zoom),但它仍然是这个样子。
此外,以下是我如何将图像从数据库加载到pictureBox中:
首先,我通过id检索属于集合的所有图像:
当从本地目录加载图像时,在pictureBox中看起来很好。我还尝试将初始图片转换为二进制格式并再次转换回来(不将其加载到数据库中),当在pictureBox中显示时,它仍然看起来很好。
另外,我在调试来自数据库的图像时发现了一些问题。当查看ImageSize时,宽度和高度都具有值16。这很奇怪,因为原始图像具有完全不同的尺寸。
有什么想法吗?
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中显示来自数据库的图片时。
因此,当我将此图像加载到数据库中时:
![enter image description here](https://istack.dev59.com/4nsaF.webp)
![enter image description here](https://istack.dev59.com/OX3VZ.webp)
此外,以下是我如何将图像从数据库加载到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;
}
}
在我的应用程序中,我有一个数据网格视图,其中ID存储在第一列。因此,当我想检索属于该集合的任何图像时,我会这样做:
private void dgvRezeptListe_CellClick(object sender, DataGridViewCellEventArgs e)
{
pbRezeptBild.Image = DBManager.GetRezeptImages(Int32.Parse(dgvRezeptListe.SelectedRows[0].Cells[0].Value.ToString())).Images[0];
}
当从本地目录加载图像时,在pictureBox中看起来很好。我还尝试将初始图片转换为二进制格式并再次转换回来(不将其加载到数据库中),当在pictureBox中显示时,它仍然看起来很好。
另外,我在调试来自数据库的图像时发现了一些问题。当查看ImageSize时,宽度和高度都具有值16。这很奇怪,因为原始图像具有完全不同的尺寸。
有什么想法吗?
LINQ to SQL
和varbinary(max)
,同样没有质量损失。请问您能展示一下从源加载图像并显示在picturebox上的代码吗?似乎问题可能与您存储图像的方式无关。 - Bernd LindeimageList.Images.Add(Helper.ByteArrayToImage(b.Bild.ToArray()));
将图像转换为图标,我仍在努力弄清原因 :) - Bernd Linde