如何在C#中解决从二进制转换后具有透明度的图像
本文关键字:透明度 图像 转换 二进制 解决 | 更新日期: 2023-09-27 18:28:55
我有一个.png格式的图像。它是一个圆形的球。我必须通过将图像转换为二进制来将其插入数据库。然而,在我取回它之后,它的透明度变成了黑色。有人知道我该怎么解决吗?
仅供参考:我知道二进制不承认透明度。
根据科里的要求:我正在使用Windows窗体应用程序将图像插入数据库。
private void btnBrowse_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "image files|*.jpg;*.png;*.gif;*.mp3";
DialogResult dr = ofd.ShowDialog();
if (dr == DialogResult.Cancel)
return;
pbImage.Image = Image.FromFile(ofd.FileName);
txtImage.Text = ofd.FileName;
}
至于查询
SqlConnection cn = new SqlConnection(@"Data Source=localhost;Initial Catalog=Games;Integrated Security=True");
MemoryStream ms = new MemoryStream();
pbImage.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
byte[] image = new byte[ms.Length];
ms.Position = 0;
ms.Read(image, 0, image.Length);
SqlCommand cmd = new SqlCommand("INSERT into CorrespondingBall(blueBallImage) values(@image)", cn);
cmd.Parameters.AddWithValue("@image", image);
您使用的代码的数据库部分还可以。我本可以用using
块编写它,但它只是示例代码:)
数据库表中的二进制字段将存储任意的字节集合,通常不关心数据的格式。由于数据库插入代码似乎还可以,因此问题早于此。
在您的代码中,您正在将图像(pbImage.Image
)转换为PNG文件。这似乎是问题的最可能来源:源图像要么没有透明度,要么转换为PNG没有正确处理透明度。
确保源图像具有实际透明度。如果是用代码绘制,请确保在开始绘制之前先将背景清除为Color.Transparent
。检查您是否使用了支持alpha通道的PixelFormat
。
试试这个代码:
byte[] imgData;
using (Bitmap bmp = new Bitmap(100, 100, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.Transparent);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
g.FillEllipse(Brushes.Red, 10, 10, 90, 90);
g.DrawString("Test", SystemFonts.DefaultFont, Brushes.Green, 30, 45);
}
using (MemoryStream ms = new MemoryStream())
{
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
imgData = ms.ToArray();
}
}
这应该会在imgData
中创建一个透明的PNG文件,您可以将其保存到数据库中并加载回来。将文件也保存到磁盘,然后查看它的外观。
--已更新。。。
由于您保留了文件名的副本,因此应该使用该副本从磁盘加载文件。这样就不会丢失透明度信息或浪费CPU周期再次压缩PNG。使用File
类的ReadAllBytes
方法从磁盘获取数据:
byte[] imgFile = System.IO.File.ReadAllBytes(txtImage.Text);
然后您可以直接将其写入数据库。这样就根本不需要对原始文件进行转换,而是直接将其加载到数据库中。从数据库中读取数据后,您将获得与原始文件的逐字节匹配。