2017-10-01 3 views
-2

J'ai deux méthodes, montrées ci-dessous, et je ne peux pas le faire fonctionner. Je suis en train d'ouvrir un fichier .png d'un OpenFileDialog et l'afficher sur un ImageBox:La valeur était trop petite ou trop grande pour un octet non signé C#

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; 
} 

Dans un autre fichier que j'ai essayé d'utiliser la méthode:

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

Mais je reçois cette exception:

System.OverflowException: «La valeur était trop grande ou trop petite pour un octet non signé.»

Aidez-nous! J'utilise ces méthodes dans une classe appelée StringToBitmapConverter, et il y a une erreur qui me cause des problèmes, quelqu'un peut-il m'aider?

Répondre

1

Ainsi, selon la documentationConvert.ToByte(string value):

convertit la représentation de chaîne spécifiée d'un nombre équivalent à un nombre entier non signé de 8 bits.

Et la méthode va jeter un OverflowException si:

valeur

représente un nombre qui est inférieur à Byte.MinValue ou supérieure à Byte.MaxValue.

Ainsi, la valeur de byteString doit être inférieure à 0 ou supérieur à 255 sur cette ligne:

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

+0

Mais comment pourrais-je résoudre le problème, qui est ce que je Je demande de l'aide avec. – Techcraft7

+0

@ Techcraft7 cela dépend de ce que vous voulez faire, ce n'est pas exactement ce que vous essayez de faire avec 'splitBytes.Add (Convert.ToByte (byteString));'. EDIT: Je viens de regarder votre code, vous essayez d'utiliser Encoding.ASCII.GetBytes (byteString) pour lire les octets du fichier pour l'ouvrir en tant que bitmap, cela ne marchera jamais. 'Encoding.ASCII' ne peut pas représenter toutes les valeurs d'octets possibles. –

+0

Alors comment le ferais-je? pouvez-vous faire un échantillon de code? – Techcraft7

0

Vous pouvez utiliser try {} catch pour attraper l'erreur ou utiliser byte.TryParse pour convertir seulement ces nombres qui sont réellement convertibles.

Lecture de textes à partir d'un fichier peut être fait par File.ReadAllText

Votre algorythme divise le texte lu dans characterblocks de 3 et interprète le texte comme octet:

« 23405716119228936 » -> 234,57,161,192,289,36. 289 ne correspond pas à un octet -> exception. Vérifiez le contenu des fichiers.

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

Edit # 1:

Je suppose que la lecture au format PNG-Files "chaîne" et en les convertissant comme vous le faites ne fonctionne pas. Les fichiers PNG ont un format interne, ils sont codés. Voir https://www.w3.org/TR/PNG/ ou https://de.wikipedia.org/wiki/Portable_Network_Graphics

Ils ne sont pas des chaînes que vous pouvez simplement regrouper en 3 caractères, convertir en octets et réinterprête sous forme de chaîne de mémoire.

Pour les fous rires essayez ceci sur votre fichier pour voir quelle est votre entrée.:

+0

Je vois si cela fonctionne. – Techcraft7

+0

Quand j'ai dit
splitBytes.Add (Byte.TryParse (byteString, out byte result));
il dit qu'il ne peut pas convertir octet en bool. (CS1503) – Techcraft7

+0

Lorsque j'ai fait ce code, il renvoie une autre erreur sur cette ligne: var img = Image.FromStream (ms); il dit que "le paramètre n'est pas valide" – Techcraft7

0

Si tout ce que vous faites est d'essayer d'ouvrir un vous Png pouvez jeter la plupart de tous de votre code et de simplifier à

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(); 
    } 

} 
+0

bien, j'essaye de faire un paquet de fichiers .dll que les gens peuvent utiliser pour le logiciel, et mon premier est la chaîne au bitmap. – Techcraft7