• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:大きな画像ByteデータをUDP転送したい)

大きな画像ByteデータをUDP転送する方法:効果的な圧縮手段とは?

このQ&Aのポイント
  • VB.net2005でサーバーアプリとクライアントアプリを作り、大きな画像ByteデータをUDP転送したいと考えています。
  • UDPを使用して画像を送信する際、縦320*横240*3(RGB)分の画像ではエラーが発生してしまいます。
  • 圧縮手段としてMemoryStreamとDeflateStreamを使用してみましたが、効果はあまり得られませんでした。他の方法でByteデータを小さくする方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こちらの「5.8 データグラムの最初の部分しか・・・」のあたりが参考になるかと。 http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-5.html 1/4の画像の転送が可能であれば、4分割して送る方法もあります。この場合、画像データの前に分割されたどこのパーツであるかを示すデータを付加すればいけると思います。160*120*3=57,600Byteは固定なので制限値内に収まります。 > それでMemoryStreamとDeflateStreamと使って圧縮してみたものの 単純に24bitカラーのByte配列をDeflateしてもさほど小さくはなりません(もちろん画像によりますが)。RGBに分解したり差分値をとれば圧縮効果があがると思います。あるいは可逆圧縮ではなくJPEG等の不可逆圧縮やビット深度を落としたりすれば転送量を削減できます。 ただ、その場合でもバッファの最大値を超えない保証はないので、やはり分割送信が可能な仕組みにしたほうがよいかと。 JPEGの生成方法はこちらで。 http://dobon.net/vb/dotnet/graphics/encoderparameters.html Imgae.Saveメソッドの出力先にIO.Streamが指定できるので、MemoryStreamを渡せばファイル化せずにJPEGのバイナリを取得できます。

alna_sag
質問者

お礼

ありがとうございます。 JPEGで生成方法してサイズを640*480のカラー画像を だいたい2万Byte程度に小さくすることが出来ました。 もう少し小さく出来ないか試してみますが、以下現状のコードです。 とても助かりました。有難うございました。 ---------- Dim imgByte() As Byte '書込みイメージバッファ 'ファイルから画像を読み込む Dim bmp As Bitmap = Bitmap.FromFile(jpgFile) 'ピクチャボックスに表示 PictureBox1.Image = bmp 'メモリストリーム作成 Dim ms As MemoryStream = New MemoryStream() 'ビットマップをメモリストリームにJPEGで保存 bmp.Save(ms, ImageFormat.Jpeg) 'データをバイト配列で取得 imgByte = ms.ToArray() ----------

関連するQ&A