如何解决在C#中从二进制转换后具有透明度的图像?
我有一张.png格式的图片。它是一个圆形的球。我必须通过将图像转换成二进制文件将其插入数据库。然而,在我检索到它之后,它的透明度变成了黑色。有人知道我该怎么解决吗 仅供参考:我知道二进制文件不能识别透明度 根据Corey的要求:我正在使用Windows窗体应用程序将图像插入数据库如何解决在C#中从二进制转换后具有透明度的图像?,c#,windows-phone-7,C#,Windows Phone 7,我有一张.png格式的图片。它是一个圆形的球。我必须通过将图像转换成二进制文件将其插入数据库。然而,在我检索到它之后,它的透明度变成了黑色。有人知道我该怎么解决吗 仅供参考:我知道二进制文件不能识别透明度 根据Corey的要求:我正在使用Windows窗体应用程序将图像插入数据库 private void btnBrowse_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDial
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);
您正在使用的代码的数据库部分是正常的。我会使用
块编写它,但它只是示例代码:)
数据库表中的二进制字段将存储任意字节集合,通常不关心数据的格式。由于数据库插入代码似乎没有问题,问题就出现在前面
在代码中,您正在将图像(pbImage.image
)转换为PNG文件。这似乎是问题最可能的根源:源图像要么没有透明度,要么转换为PNG时没有正确处理透明度
确保源图像具有实际的透明度。如果是用代码绘制,请确保在开始绘制之前先将背景清除为Color.Transparent
。检查您使用的是支持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();
}
}
这将在imgData
中创建一个透明的PNG文件,您可以将其保存到数据库并加载回。将文件也保存到磁盘,然后查看它的外观
--更新
因为您保留了文件名的副本,所以应该使用该副本从磁盘加载文件。这样就不会丢失透明度信息或浪费CPU周期再次压缩PNG。使用File
类的ReadAllBytes
方法从磁盘获取数据:
byte[] imgFile = System.IO.File.ReadAllBytes(txtImage.Text);
然后您可以将其直接写入数据库。这样,您根本不需要对原始文件进行任何转换,而是直接将其加载到数据库中。从数据库中读取后,您将获得与原始文件逐字节的匹配。数据库中的二进制字段应能够包含任何任意数据,包括原始PNG文件。向我们展示将PNG存储到数据库中的代码。嗨@Corey,我已经编辑过了。一定要看一看!谢谢你,谢谢你,科里。但我不懂你的密码。pbImage实际上是通过在我的计算机中浏览来选择的图像。这并不是在代码中绘制。很抱歉没有早点告诉你。我已经编辑过了。一定要看一看。科里,我试过了。然而,我的申请中有一个错误。我试图将源设置为位图图像。然而,我发现了一个未指明的错误。