我有一个应用程序,我正在添加图片,这些应用程序会自动转换为二进制文件并存储在一个文件中。如何保存多个图像,我保留在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;
}
}
答案 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>
使用序列化直接写入文件 使用反序列化直接读取列表