Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决在C#中从二进制转换后具有透明度的图像?_C#_Windows Phone 7 - Fatal编程技术网

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

如何解决在C#中从二进制转换后具有透明度的图像?,c#,windows-phone-7,C#,Windows Phone 7,我有一张.png格式的图片。它是一个圆形的球。我必须通过将图像转换成二进制文件将其插入数据库。然而,在我检索到它之后,它的透明度变成了黑色。有人知道我该怎么解决吗 仅供参考:我知道二进制文件不能识别透明度 根据Corey的要求:我正在使用Windows窗体应用程序将图像插入数据库 private void btnBrowse_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDial

我有一张.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);

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

数据库表中的二进制字段将存储任意字节集合,通常不关心数据的格式。由于数据库插入代码似乎没有问题,问题就出现在前面

在代码中,您正在将图像(
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实际上是通过在我的计算机中浏览来选择的图像。这并不是在代码中绘制。很抱歉没有早点告诉你。我已经编辑过了。一定要看一看。科里,我试过了。然而,我的申请中有一个错误。我试图将源设置为位图图像。然而,我发现了一个未指明的错误。