web-dev-qa-db-fra.com

Moyen le plus rapide de convertir une image en tableau d'octets

Je crée une application de partage de bureau à distance dans laquelle je capture une image du bureau, la compresse et l'envoie au destinataire. Pour compresser l'image, j'ai besoin de la convertir en octet [].

Actuellement, j'utilise ceci:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
    return  ms.ToArray();
}

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

Mais je ne l’aime pas parce que je dois le sauvegarder dans un ImageFormat et que cela peut également utiliser des ressources (ralentir) ainsi que produire différents résultats de compression. les comprendre.

Y a-t-il une autre méthode pour atteindre cet objectif?

101
user2529551

Y a-t-il une autre méthode pour atteindre cet objectif?

Non. Pour convertir une image en tableau d'octets, vous devez spécifier un format d'image, comme vous devez spécifier un codage lors de la conversion de texte. à un tableau d'octets.

Si les artefacts de compression vous préoccupent, choisissez un format sans perte. Si vous êtes préoccupé par les ressources du processeur, choisissez un format qui ne gêne pas la compression, par exemple, uniquement les pixels bruts ARV. Mais bien sûr, cela conduira à un tableau d'octets plus grand.

Notez que si vous choisissez un format qui inclut la compression, il ne sert à rien de compresser ensuite le tableau d'octets - il est presque certain que cela n'aura aucun effet bénéfique.

39
Jon Skeet

Il existe une propriété RawFormat du paramètre Image qui renvoie le format de fichier de l'image. Vous pourriez essayer ce qui suit:

// extension method
public static byte[] imageToByteArray(this System.Drawing.Image image)
{
    using(var ms = new MemoryStream())
    {
        image.Save(ms, image.RawFormat);
        return ms.ToArray();
    }
}
50
Newt
public static byte[] ReadImageFile(string imageLocation)
    {
        byte[] imageData = null;
        FileInfo fileInfo = new FileInfo(imageLocation);
        long imageFileLength = fileInfo.Length;
        FileStream fs = new FileStream(imageLocation, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fs);
        imageData = br.ReadBytes((int)imageFileLength);
        return imageData;
    }
13
bhadresh

Je ne sais pas si vous obtiendrez des gains énormes pour les raisons exposées par Jon Skeet. Cependant, vous pouvez essayer de comparer la méthode TypeConvert.ConvertTo et voir comment elle se compare à l'utilisation de votre méthode actuelle.

ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
13
keyboardP
public static class HelperExtensions
{
    //Convert Image to byte[] array:
    public static byte[] ToByteArray(this Image imageIn)
    {
        var ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return ms.ToArray();
    }

    //Convert byte[] array to Image:
    public static Image ToImage(this byte[] byteArrayIn)
    {
        var ms = new MemoryStream(byteArrayIn);
        var returnImage = Image.FromStream(ms);
        return returnImage;
    }
}
4
Ahmad Aghazadeh

Le moyen le plus rapide que je puisse trouver est le suivant:

var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, typeof(byte[]));

J'espère être utile

2
alireza amini