108

デスクトップの画像をキャプチャして圧縮し、受信者に送信するリモートデスクトップ共有アプリケーションを作成しています。画像を圧縮するには、画像を byte[] に変換する必要があります。

現在、私はこれを使用しています:

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

しかし、私はそれを ImageFormat で保存する必要があり、リソースを使い果たし (スローダウン)、異なる圧縮結果を生成する可能性があるため、好きではありません.Marshal.Copy と memcpy を使用して読みましたが、できませんそれらを理解してください。

この目標を達成するための他の方法はありますか?

4

7 に答える 7

53

画像のファイル形式を返す Image パラメータの RawFormat プロパティがあります。次のことを試してみてください。

// extension method
public static byte[] imageToByteArray(this System.Drawing.Image image)
{
    using(var ms = new MemoryStream())
    {
        image.Save(ms, image.RawFormat);
        return ms.ToArray();
    }
}
于 2014-05-19T07:05:17.323 に答える
39

この目標を達成するための他の方法はありますか?

いいえ。画像をバイト配列に変換するには、テキストをバイト配列に変換するときエンコーディングを指定する必要があるのと同じように、画像形式を指定する必要があります。

圧縮アーティファクトが心配な場合は、可逆形式を選択してください。CPU リソースが心配な場合は、圧縮を気にしない形式を選択してください。たとえば、生の ARGB ピクセルだけです。しかしもちろん、それはより大きなバイト配列につながります。

圧縮を含む形式を選択した場合、後でバイト配列を圧縮しても意味がないことに注意してください有益な効果がないことはほぼ確実です。

于 2013-06-27T19:57:09.943 に答える
14

Jon Skeet が指摘した理由で、大きな利益が得られるかどうかはわかりません。ただし、TypeConvert.ConvertToメソッドを試してベンチマークし、現在のメソッドを使用した場合と比較してみることができます。

ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
于 2013-06-27T20:02:01.803 に答える
3

私が見つけることができる最速の方法はこれです:

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

役に立つことを願っています

于 2016-08-14T05:23:50.533 に答える