Je crée une application de partage de bureau à distance dans laquelle je capture une image du bureau, je la compresse et je l'envoie au récepteur. 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 car je dois l'enregistrer dans un ImageFormat et cela peut également utiliser des ressources (ralentir) et produire des résultats de compression différents.J'ai lu sur l'utilisation de Marshal.Copy et memcpy mais je suis incapable de les comprendre.
Existe-t-il donc une autre méthode pour atteindre cet objectif?
MemoryStream
; c'est une ressource entièrement gérée, sauf si vous l'utilisez dans la communication à distance. Dans ces deux cas, il serait inapproprié de disposer de la ressource.Réponses:
Non. Pour convertir une image en tableau d'octets, vous devez spécifier un format d'image - tout comme vous devez spécifier un encodage lorsque vous convertissez du texte en 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 - uniquement des pixels ARVB bruts, par exemple. Mais bien sûr, cela conduira à un plus grand tableau d'octets.
Notez que si vous choisissez un format qui ne comprend la compression, il n'y a pas de point dans la compression puis le tableau d'octets après - il est presque certain d'avoir aucun effet bénéfique.
la source
imageIn.RawFormat
tentatives de sauvegarde des octets de l'image brute sans réencodage supplémentaire.Il existe une propriété RawFormat du paramètre Image qui renvoie le format de fichier de l'image. Vous pouvez essayer ce qui suit:
la source
myObject.Dispose()
ouusing(myObject){}
- les deux font la même chose, mais l'instruction using crée essentiellement une portée qui nettoiera pour vous.Je ne sais pas si vous allez obtenir des gains énormes pour les raisons évoqué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.
la source
la source
la source
Le moyen le plus rapide pour le savoir est le suivant:
J'espère être utile
la source
System.Windows.Controls.Image
objets. Si vous voulez convertir l'un de ceux-ci en octets et que vous le passez à cette ligne en tant queInputImg
, cela ne fonctionnera pas. Il attend unSystem.Drawing.Image
objet.