如何在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);

如何在C#中解决从二进制转换后具有透明度的图像

您使用的代码的数据库部分还可以。我本可以用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);

然后您可以直接将其写入数据库。这样就根本不需要对原始文件进行转换,而是直接将其加载到数据库中。从数据库中读取数据后,您将获得与原始文件的逐字节匹配。