gpt4 book ai didi

C# 字节数组到图像不使用相同的字节数组

转载 作者:行者123 更新时间:2023-11-30 16:07:01 28 4
gpt4 key购买 nike

完整代码

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 方法时正确显示图片。

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

最佳答案

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

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

... 并且 using block 在出路时处理 MemoryStream 实例,这使得 Image 相当无用。

您可以通过调用 Clone() 获得管理其自身内存的 Image,而不是期望您的流停留在周围:

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

克隆未绑定(bind)到原始流。

关于C# 字节数组到图像不使用相同的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31303550/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com