Question Le moyen le plus rapide de convertir une image en tableau d'octets


Je crée une application de partage Remote Desktop dans laquelle je capture une image du bureau et la compresse, puis l'envoie au destinataire. Pour compresser l'image, je dois 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 l'enregistrer dans un ImageFormat et que cela peut aussi utiliser des ressources (Slow Down) et produire des résultats de compression différents. les comprendre.

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


97
2018-06-27 19:54


origine


Réponses:


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

Pour convertir une image en un tableau d’octets, vous devez avoir pour spécifier un format d'image - tout comme vous devez spécifier un codage lorsque vous convertissez du texte en un tableau d'octets.

Si vous vous inquiétez des artefacts de compression, 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 - juste des pixels ARGB bruts, par exemple. Mais bien sûr, cela conduira à un tableau d'octets plus grand.

Notez que si vous choisissez un format qui Est-ce que inclure la compression, il est inutile de compresser ensuite le tableau d’octets - il est presque certain qu’il n’a aucun effet bénéfique.


37
2018-06-27 19:57



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

46
2018-05-19 07:05



Je ne sais pas si vous allez obtenir des gains énormes pour les raisons que Jon Skeet a mentionnées. Cependant, vous pouvez essayer de comparer les TypeConvert.ConvertTo méthode et voir comment il se compare à l'aide de votre méthode actuelle.

ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));

11
2018-06-27 20:02



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

11
2018-05-02 08:33



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
2018-03-30 08:10



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
2017-08-14 05:23