-2

我有 2 种方法,如下所示,但我无法让它工作。我正在尝试.png从 a 打开文件OpenFileDialog并将其显示在 a 上ImageBox

public static Bitmap ToBitmap(this string input)
{
    List<byte> splitBytes = new List<byte>();
    string byteString = "";
    foreach (char i in input)
    {
        byteString += i;
        if (byteString.Length == 3)
        {
            splitBytes.Add(Convert.ToByte(byteString));
            byteString = "";
        }
    }
    if (byteString != "")
        splitBytes.AddRange(Encoding.ASCII.GetBytes(byteString));
    using (var ms = new MemoryStream(splitBytes.ToArray()))
    {
        var img = Image.FromStream(ms);
        Bitmap output = new Bitmap(img);
        return output;
    }
}

public static string StringFromFile(string input)
{
    StreamReader sr = new StreamReader(input);
    string file = string.Empty;
    while (sr.EndOfStream == false)
    {
        file += sr.Read();
    }
    return file;
}

在另一个文件中,我尝试使用该方法:

OpenFileDialog OFD = new OpenFileDialog();
OFD.Filter = "Images (*.png)|*.png";
OFD.ShowDialog();
pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
pictureBox1.BackgroundImage = StringToBitmapConverter.ToBitmap(StringToBitmapConverter.StringFromFile(OFD.FileName));

但我得到了这个例外:

System.OverflowException:“对于无符号字节而言,值太大或太小。”

请帮忙!我在一个名为 的类中使用这些方法StringToBitmapConverter,并且有一个错误给我带来麻烦,有人可以帮助我吗?

4

3 回答 3

1

所以根据文档 Convert.ToByte(string value)

将数字的指定字符串表示形式转换为等效的 8 位无符号整数。

该方法将抛出一个OverflowExceptionif:

value 表示小于 Byte.MinValue 或大于 Byte.MaxValue 的数字。

所以在这一行的值byteString必须小于 0 或大于 255:

splitBytes.Add(Convert.ToByte(byteString));

于 2017-10-01T19:59:13.970 回答
0

如果您所做的只是尝试打开一个 png,您可以丢弃大部分代码并将其简化为

OpenFileDialog OFD = new OpenFileDialog();
OFD.Filter = "Images (*.png)|*.png";
var result = OFD.ShowDialog()    
if(result == DialogResult.OK) //You need to check to see if they clicked OK or Cancel.
{
    pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;

    var oldImage = pictureBox1.BackgroundImage
    pictureBox1.Image = new Bitmap(OFD.FileName); //Shouold be Image, not BackgroundImage for a picture box.
    if(oldImage != null)
    {
        oldImage.Dispose();
    }

}
于 2017-10-01T22:32:33.400 回答
0

您可以使用 try { } catch 来捕获错误或使用byte.TryParse仅转换那些实际可转换的数字。

从文件中读取文本可以通过File.ReadAllText完成

您的算法将读取的文本拆分为 3 个字符块并将文本解释为字节:

“23405716119228936”-> 234,57,161,192,289,36 .... 289 不适合一个字节-> 异常。检查文件内容。

if (byte.TryParse(byteString, out var b))
{
    splitBytes.Add(b);
}
else
{
    // this thing is not convertable to byte, do something with it....
}

编辑#1:

我想在 PNG 文件中读取为“字符串”并像你一样转换它们是行不通的。

PNG 文件具有内部格式,它们是经过编码的。请参阅 https://www.w3.org/TR/PNG/https://de.wikipedia.org/wiki/Portable_Network_Graphics

它们不是您可以简单地分组为 3 个字符、转换为字节并重新解释为内存字符串的字符串。

对于咯咯笑,在你的文件上试试这个,看看你的输入是什么。:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

internal class Program
{
    static void Main(string[] args)
    {
        foreach (var s in Make3CharChunks(File.ReadAllText( /*your file path here*/ ""))
            Console.WriteLine(s);

        Console.ReadLine();
    }

    static IEnumerable<string> Make3CharChunks(string s)
                        => s.Aggregate(new List<string>(), (acc, c) =>
                {
                    if (acc.Any() && acc.Last().Count() < 3)
                        acc[acc.Count - 1] = $"{acc.Last()}{c}";
                    else
                        acc.Add(c.ToString());

                    return acc;
                });
}
于 2017-10-01T21:04:17.403 回答