2

我有一个 .png 格式的图像。它是一个圆形球。我必须通过将图像转换为二进制来将图像插入到我的数据库中。然而,在我取回它之后,它的透明度变成了黑色。有谁知道我该如何解决?

仅供参考:我知道二进制不承认透明度。

根据 Corey 的要求:我正在使用 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);
4

1 回答 1

0

您正在使用的代码的数据库部分是可以的。我会用using块编写它,但这只是示例代码:)

数据库表中的二进制字段将存储任意字节集合,通常不关心数据的格式。由于数据库插入代码似乎还可以,所以问题比那更早。

在您的代码中,您将图像 ( pbImage.Image) 转换为 PNG 文件。这似乎是问题的最可能根源:您的源图像要么没有透明度,要么转换为 PNG 没有正确处理透明度。

确保您的源图像具有实际透明度。如果您在代码中绘制它,请确保Color.Transparent在开始绘制之前先清除背景。检查您使用的PixelFormat是否支持 Alpha 通道。

试试这个代码:

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();
    }
}

这应该会创建一个透明的 PNG 文件imgData,您可以在其中保存到数据库并重新加载。将文件也保存到磁盘,看看它是什么样子的。

- 更新...

由于您保留了文件文件名的副本,因此您应该使用它从磁盘加载文件。这样您就不会丢失透明度信息或浪费 CPU 周期再次压缩 PNG。使用类的ReadAllBytes方法File从磁盘获取数据:

byte[] imgFile = System.IO.File.ReadAllBytes(txtImage.Text);

然后,您可以将其直接写入数据库。这样一来,您根本不需要转换原始文件,它会直接加载到数据库中。然后从数据库中读取会为您提供与原始文件的逐字节匹配。

于 2013-08-26T03:46:32.463 回答