デスクトップの画像をキャプチャしてそれを圧縮し、それを受信側に送信するリモートデスクトップ共有アプリケーションを作成しています。画像を圧縮するには、それを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に保存する必要があり、リソースの使用量が増える(Slow Down)ことや、異なる圧縮結果が生じることがあるので、私は好きではありません。Marshal.Copyとmemcpyの使用を読みましたが、できません。理解してください。
それでは、この目標を達成するための他の方法はありますか?
それでは、この目標を達成するための他の方法はありますか?
いいえ。画像をバイト配列に変換するには、テキストをバイト配列に変換するときにエンコーディングを指定する必要があるのと同じように、画像フォーマットを指定するためにhaveを使用します。
圧縮アーティファクトが心配な場合は、可逆形式を選択してください。あなたがCPUリソースを心配しているならば、圧縮を気にしないフォーマットを選んでください - 例えば生のARGBピクセルだけです。しかし、もちろんそれはより大きなバイト配列につながります。
もし、あなたが=圧縮を含むフォーマットを選んだとしても、その後にバイト配列を圧縮する意味はありません - 有益な効果がないことはほぼ確実です。
画像のファイルフォーマットを返す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();
}
}
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;
}
Jon Skeet氏が指摘した理由で大きな利益が得られるかどうかはわかりません。ただし、 TypeConvert.ConvertTo メソッドを試してベンチマークし、現在のメソッドを使用する方法と比較してみてください。
ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
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;
}
}
私が見つけることができる最も速い方法はこれです:
var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, typeof(byte[]));
役に立つことを願っています