如何从这个编码的png图像数据中获取PNG图像

时间:2016-08-11 07:44:47

标签: c# image png decode encode

我有如下的PNG图像数据,但我无法使用任何解码方法对其进行解码。

对此有所了解的人帮助我通过使用此编码/解码技术来获取图像。

"�PNG\r\n\u001a\n\0\0\0\rIHDR\0\0\u0013`\0\0\u001bf\u0001\0\0\0\0Nw�v\0\0 \0IDATx��O��H���(/�\u0017\u0006�b-tP\u001ej�U؃����4\u0005l)Y�}�Q\u001fa���9*\a���ڢgGo{\u001f\u0006\u001d_@@C��\u0004:,�\u001e�\t\u001d\u0004�\u001c�0��o\n*a �\u0019��6��I���H�����o�#\u007f\u000f\"#��iF��9iƗ\u00165\0\u0010\u0011=t\u0001��\u0003d\u0003d@6@\u0006d\u0003d@6@\u0006d\u0003d@6@\u0006d\u0003d@6@\u0006d\u0003d....

它拥有IHDR,IDAT,IEND等所有png关键组块。

//用于编码

byte[] buf = File.ReadAllBytes(@"C:\Users\GPL\Desktop\Newfolder\balloon_PNG4957.png");
var s = Encoding.ASCII.GetString(buf);
File.WriteAllText(@"C:\Users\GPL\Desktop\balloon_PNG4957.txt", s);

//用于解码

var rawdata = File.ReadAllText(@"C:\Users\GPL\Desktop\balloon_PNG4957.txt");
byte[] buf = Encoding.ASCII.GetBytes(rawdata);
var ms = new MemoryStream(buf);
var bitmap = Image.FromStream(ms);  //Error
pictureBox1.Image = bitmap;

这里解码时我收到错误 - ""参数无效"。 "

1 个答案:

答案 0 :(得分:0)

它被称为转义字符串文字

尝试这个(在st=之后替换真实文本),如下所示:

    string st= "�PNG\r\n\u001a\n\0\0\0\rIHDR\0\0\u0013`\0\0\u001bf...";
    File.WriteAllBytes("png.png",  st.Select(s => (byte) s).ToArray());

或只是将char转换为char

var  ba = new List<byte>();
foreach (var s in st)
{ 
    ba.Add((byte) s);
}  
File.WriteAllBytes("png.png",  ba.ToArray());

注意:对于两个字节,Unicode字符在ba.Add((byte) (s>>8));内使用另一个foreach

这就是您所需要的:C# escape characters in user input

请参阅:Can I convert a C# string value to an escaped string literal

如果是文件,您可以像这样阅读并在pictureBox1内显示:

var bitmap = Image.FromFile(@"filename.png");
pictureBox1.Image = bitmap;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

如果是StreamMemoryStreambyte[],请使用此字段:

byte[] buf = File.ReadAllBytes(@"filename.png");
var ms=new MemoryStream(buf);

var bitmap = Image.FromStream(ms);
pictureBox1.Image = bitmap;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

是ASCII编码:

byte[] buf = File.ReadAllBytes(@"filename.png"); 
var sb=new StringBuilder();
var s=Encoding.ASCII.GetString(buf );
textBox1.Text = buf.Length + @", " + s.Length;
File.WriteAllText("png.txt", s);