バイト配列を直接PictureBoxのImgeプロパティーにセットするには

タグの編集
投稿者 (削除されました)  () 投稿日時 2016/12/9 05:16:30
(削除されました)
投稿者 ねぼすけ  (社会人) 投稿日時 2016/12/9 05:19:55
あるファイルから抜き出したバイト配列「byteData(...)」がjpgファイルのとき
FileStreamクラスを使用し、
Using fs As New IO.FileStream("D:\Test\myFile.jpg",IO.FileMode.Create)
    fs.Write(byteData,0,byteData.Length)
End Using
で、Testフォルダにjpgファイルを作成し、
PictureBox1.SizeMode=PictureBoxSizeMode.StretchImage
PictureBox1.Image=Image.FromFile("D:\Test\myFile.jpg")
というように、PictureBoxに描画していたのですが、バイト配列をjpgファイルを作成しないで
直接描画するにはどうしたら良いでしょうか。お願いします。

投稿題 Imge → Image
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/12/9 10:05:13
Function ToImage(ByVal byteData() As ByteAs Image
    Using stm As New System.IO.MemoryStream(byteData)
        Return Image.FromStream(stm)
    End Using
End Function
投稿者 ねぼすけ  (社会人) 投稿日時 2016/12/10 06:43:47
魔界の仮面弁士さん、できました。
ここでのポイントは「IO.MemoryStream」と「Image.FromStream()」ですね。
MSDNで、「バッキング ストアとしてメモリを使用するストリームを作成」と書いてありましたが、
「IO.FileStream」は保存されているファイルのストリーム、「IO.MemoryStream」は保存されていないストリームと考えて良いでしょうか。
PictureBox.Image=image.・・・は、だいだい「FromFile」と「FromStream」を覚えておけば良いでしょうか。
また、恥ずかしい質問ですが、魔界の仮面弁士さんのコードでは「Function」の前に「Private」や「Public」がありませんが、可能なのですね。で、スコープ(?)は何になりますか。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/12/13 10:54:54
> 「IO.FileStream」は保存されているファイルのストリーム、
> 「IO.MemoryStream」は保存されていないストリームと考えて良いでしょうか。

間違いでは無いですが、保存されているかどうかというよりは
何に対するストリームであるかという認識の方がが良いでしょう。


標準では、他にもこのようなストリームが用意されています。

Stream → すべてのストリームの基本クラス
FileStream → ファイルをストリームとして扱う
MemoryStream → オンメモリの情報をストリームとして扱う
NetworkStream → ネットワーク通信をストリームとして扱う
UnmanagedMemoryStream → アンマネージなメモリブロック向け
CryptoStream → 暗号化/複合化処理をストリームとして扱う
GZipStream → GZip 圧縮/圧縮解除をストリームとして扱う
DeflateStream → Deflate 圧縮/圧縮解除をストリームとして扱う


この中の CryptoStream を例に挙げてみると、
Read すれば、暗号化されたデータを複合して読み出し、
Write すれば、平文データを暗号化して書き込むという、
暗号化処理を単純化するためのクラスになっています。
(どのような暗号化方式を採用するかは、別のクラスで指定します)

そしてこの CryptoStream のコンストラクタでは、第一引数として
「他の Stream」を受け取るようになっているのですが、
その相手は FileStream でも MemoryStream でも構いませんので、
ストリームが「保存されているかどうか」とは無関係なわけです。

そしてもちろん、CryptoStream に対しても Image.FromStream は利用できます。
ストリームが保存されているものであるかどうかとは関係なく。


>「Function」の前に「Private」や「Public」がありませんが、可能なのですね。
省略してしまいましたが、付与した方が丁寧ですね。


> で、スコープ(?)は何になりますか。 
Function や Sub に対して省略した場合、常に Public 扱いになります。

フィールド変数の場合は、
 Structure 直下の Dim x As Integer → Public x AS Integer の意味
 Module 直下の Dim x As Integer → Private x AS Integer の意味
 Class 直下の Dim x As Integer → Private x AS Integer の意味
のように変化します。
投稿者 ねぼすけ  (社会人) 投稿日時 2016/12/14 13:54:31
SteamではNetworkStream以下、未知の世界ですが、Streamの対象で認識するようにします。
また、
>>「Function」の前に「Private」や「Public」がありませんが、可能なのですね。
からは、エントリーポイント(考えても見なかった)や提供されている参考コードがConsoleApplicationで動作するためShared Sub Main()にぶち当たり、前に進めないでいましたが、少し、すっきりしました。
魔界の仮面弁士さん、どうもありがとうございます。