【问题标题】:C# byte array to image not working with identical byte arraysC# 字节数组到图像不能使用相同的字节数组
【发布时间】:2015-09-27 00:08:33
【问题描述】:

完整代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Display byte array as image
        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            Image img = ByteArrayToImage(File.ReadAllBytes("")); //fill with path info

            pictureBox1.Image = (Image)img.Clone();
        }

        //Convert to image from bytes
        public Image ByteArrayToImage(byte[] byteArrayIn)
        {
            using (MemoryStream ms = new MemoryStream(byteArrayIn))
            {
                ms.Position = 0;
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
        }

        //Open Image for conversion
        private void loadImage_Click(object sender, EventArgs e)
        {
            OpenFileDialog opf = new OpenFileDialog();
            DialogResult dr = new DialogResult();
            dr = opf.ShowDialog();
            if (dr == DialogResult.OK)
            {
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox1.Image = Image.FromFile(opf.FileName);
            }
        }

        private void convertImage_Click(object sender, EventArgs e)
        {
            //Choose Path to Save To
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.Title = "Choose Directory and File Name";
            saveDialog.Filter = "Canga Comix *.CCMX|*.CCMX";
            DialogResult dr = saveDialog.ShowDialog();
            if (dr == DialogResult.OK)
            {
                byte[] array;

                //Save Image
                using (MemoryStream ms = new MemoryStream())
                {
                    Image img = pictureBox1.Image;
                    img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                    array = ms.ToArray();
                }

                using(FileStream fs = new FileStream(saveDialog.FileName, FileMode.Create))
                {
                    fs.Write(array, 0, array.Length);
                }
            }
        }

        //clear image
        private void clearImage_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = null;
        }
    }
}

这些都是相当标准的。我有一个使用这些方法的测试程序。它在pictureBox 中打开一个图像,然后将其转换为byte[] 并清除pictureBox 图像。然后你可以点击 Load byte[] ,它会在运行 ByteArrayToImage 方法时正确显示图片。

然后,如果我从我的其他程序中保存一张图片并尝试在测试程序中打开它,它会给我一个邪恶的“参数无效”错误。尽管据我所知这两个文本文档完全相同。

【问题讨论】:

  • 你如何保存图像?
  • 请显示完整的异常以及堆栈跟踪,以及引发异常的代码。
  • 正如其他人所说,“从我的其他程序中保存图片并尝试在测试程序中打开它”的代码会很有用。
  • 已编辑。这就是全部。我的大程序以完全相同的方式保存图像。

标签: c# arrays image parameters bytearray


【解决方案1】:

此代码包含一个常见问题。在这里,您创建一个Image 绑定到包含您的位图的流...

public Image ByteArrayToImage(byte[] byteArrayIn)
{
    using (MemoryStream ms = new MemoryStream(byteArrayIn))
    {
        ms.Position = 0;
        Image returnImage = Image.FromStream(ms);
        return returnImage;
    }
}

...而using 块在退出时处理MemoryStream 实例,这使得Image 相当无用。

您可以通过调用Clone() 获得一个管理自己的内存的Image,而不是期望您的流保留:

public Image ByteArrayToImage(byte[] byteArrayIn)
{
    using (MemoryStream ms = new MemoryStream(byteArrayIn))
    using (Image returnImage = Image.FromStream(ms))
    {
        return returnImage.Clone();
    }
}

克隆未绑定到原始流。

【讨论】:

  • 很高兴知道并感谢您提供的信息。但问题仍然存在。我可以打开一个文件,但不能打开一个完全相同但从我的其他程序创建的文件。我的其他程序还在图像上方添加了一些额外的信息,我必须手动删除这些信息,但文件完全相同。我保存后无法在我的测试程序中读取它。
  • 所以我决定从工作文件中复制文本并将其粘贴到另一个非工作文件中,以确保它们相同并且仍然无法正常工作。然后,当我在删除其内容后将工作文件文本粘贴回自身时,它无法打开并引发相同的错误。修改是什么导致了这种情况?即使修改只是删除文本并重新粘贴相同的文本?
  • 文本?位图文件需要专为处理二进制数据而设计的工具。
  • 图像被转换为​​字节数组,然后保存到文本文件中。哪个有效,但并非始终如一。这个问题是编码引起的吗?还是缺少?
  • 也许吧。您至少应该使用二进制工具(例如字节的十六进制视图)来确定您的工作案例和非工作案例之间的不同之处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
相关资源
最近更新 更多