C#Read Byte [] to Image

时间:2014-06-13 02:46:44

标签: c# image byte converter

我有一个应用程序,我正在添加图片,这些应用程序会自动转换为二进制文件并存储在一个文件中。如何保存多个图像,我保留在XML文件的开始和每组refente到图像字节的大小。但它有几个字节的图像,每当我尝试选择一组不同的字节时,只需打开相同的图像。我希望你的帮助能够解决这个问题并打开不同的图像。

代码

//添加图片

private void btAddImage_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog op = new OpenFileDialog();
            op.Title = "Selecione a Imagem";
            op.Filter = "All supported graphics|*.jpg;*.jpeg;*.png|" +
                "JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|" +
                "Portable Network Graphic (*.png)|*.png";

            if (op.ShowDialog() == true)
            {
                imgPatch.Source = new BitmapImage(new Uri(op.FileName));
                txtName.Focus();
            }
        }


//Convert Image

 private void btConvertImage_Click(object sender, RoutedEventArgs e)
        {
            if (String.IsNullOrEmpty(txtName.Text))
            {
                txtName.Focus();
                MessageBox.Show("Preencha o Nome", "Error");
            }

            else
            {
                save(ConvertFileToByteArray(op.FileName), txtName.Text);
            }
        }

//Image to Byte Array

private static byte[] ConvertFileToByteArray(String FilePath)
        {
            return File.ReadAllBytes(FilePath);
        }


//Save Binary File and XML File

public void save(byte[] img, string nome)
        {
            FileStream f;
            long ini, fin = img.Length; 

            if (!File.Exists("Escudos.bcf"))
            {
                f = new FileStream("Escudos.bcf", FileMode.Create);
                ini = 0;
            }

            else
            {
                f = new FileStream("Escudos.bcf", FileMode.Append);
                ini = f.Length + 1;
                bin = new TestBinarySegment();

            }

            bin.LoadAddSave("Escudos.xml", "Brasileiro", nome, ini, fin);



            BinaryWriter b = new BinaryWriter(f);
            b.Write(img);
            b.Close();
            f.Dispose();



        }


//Load Image from Byte
private void btLoad_Click(object sender, RoutedEventArgs e)
        {
            getImageFromByte();
        }


//Byte to Image
public void getImageFromByte(int start, int length)
        {
            using (FileStream fs = new FileStream("Escudos.bcf", FileMode.Open))
            {
                byte[] iba = new byte[fs.Length+1];
                fs.Read(iba, start, length);
                Image image = new Image();
                image.Source = BitmapFrame.Create(fs, BitmapCreateOptions.None,
                                          BitmapCacheOption.OnLoad);

                imgPatch2.Source = image.Source;
            }
        }

2 个答案:

答案 0 :(得分:1)

FileStream.Read offset 参数是缓冲区中要放置数据的起始偏移量。如果要从流中的偏移量读取,则必须Seek到该位置。我想你想要的是下面的内容,虽然我不完全确定BitmapFrame.Create如果文件中的数据超出了它想要读取的图像的数量,它会做什么。

fs.Seek(start, SeekOrigin.Begin);
Image image = new Image();
image.Source = BitmapFrame.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);

将文件指针移动到正确的起始位置。

我删除了字节数组,因为你似乎没有把它用于任何有建设性的东西。

如果这不起作用,那么你必须将数据读入一个字节数组,创建一个MemoryStream,并从中创建位图:

byte[] ida = new byte[length];
using (FileStream fs = File.OpenRead("Escudos.bcf"))
{
    fs.Seek(start, SeekOrigin.Begin);
    fs.Read(ida, 0, length);
}
using (MemoryStream ms = new MemoryStream(ida))
{
    Image image = new Image();
    image.Source = BitmapFrame.Create(fs, BitmapCreateOptions.None,
        BitmapCacheOption.OnLoad);
    imgPatch2.Source = image.Source;
}

答案 1 :(得分:0)

最简单的方法是使用序列化和反序列化

上课

[serializable]
myImage
{
   Byte[] ImageData;
}

Add each image to a List
List<myImage>

使用序列化直接写入文件 使用反序列化直接读取列表