从“随机”字节数组生成(并保存在磁盘中)图像

时间:2014-06-10 11:49:40

标签: c# image

我正在构建一个信息块,最后将其转换为字节数组。 我想知道是否可以将其转换为图像?

我知道最终它不会显示任何内容"有意义,这将是一个更抽象的结果,这正是我正在寻找的。

我已尝试过以下代码,但它会返回异常......:

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

我该怎么做?

3 个答案:

答案 0 :(得分:3)

您当前正在尝试解析随机字节数组,就好像它包含完整的有效图像文件一样,包括某些图像格式的有效标头。您的字节数组很可能不包含此类标头,因此无法将其解析为图像。尝试这样的事情:

public Image byteArrayToImage(byte[] byteArrayIn)
{
    int size = (int)Math.Sqrt(byteArrayIn.Length); // Some bytes will not be used as we round down here

    Bitmap bitmap = new Bitmap(size, size, PixelFormat.Format8bppIndexed);
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);

    try
    {
        // Copy byteArrayIn to bitmapData row by row (to account for the case
        // where bitmapData.Stride != bitmap.Width)
        for (int rowIndex = 0; rowIndex < bitmapData.Height; ++rowIndex)
            Marshal.Copy(byteArrayIn, rowIndex * bitmap.Width, bitmapData.Scan0 + rowIndex * bitmapData.Stride, bitmap.Width);
    }
    finally
    {
        bitmap.UnlockBits(bitmapData);
    }

    return bitmap;
}

答案 1 :(得分:1)

如果要检索信息块,请使用无损图像格式,例如带有rgb值的bmp。

您必须使用足够大的值来初始化bmp高度和宽度,以存储所有byteArrayIn。由于rgb值为3个字节,因此必须将byteArrayIn大小除以3以获得像素数,然后找到适合该像素数的矩形大小。例如,如果byteArrayIn长度为312000字节:

312000/3 = 104000像素(因此您可以使用208 x 500像素位图)

如果biteArrayIn大小不是3的倍数,或者您希望bmp达到一定的大小,则可能需要添加填充数据。

查看示例代码here

答案 2 :(得分:-2)

您必须生成一个字节数组,但您必须知道文件(或图像)的第一个字节通常决定文件的类型,然后,您必须生成第一个&#34;标头字节&#34;并在添加随机字节后。 &#34;头字节&#34;的类型和顺序及含义取决于文件或图像的类型,例如:

JPEG image files begin with FF D8 and end with FF D9.

从维基百科中提取 http://en.wikipedia.org/wiki/Magic_number_%28programming%29