C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

WPFのImageコントロールからローカル保存 /senamoon (21/03/26(Fri) 21:43) #97100
Re[1]: WPFのImageコントロールからローカル保存 /通りすがり (21/03/26(Fri) 23:10) #97101
  └ Re[2]: WPFのImageコントロールからローカル保存 /senamoon (21/03/27(Sat) 13:31) #97102
    └ Re[3]: WPFのImageコントロールからローカル保存 /Hongliang (21/03/27(Sat) 20:07) #97104


親記事 / ▼[ 97101 ]
■97100 / 親階層)  WPFのImageコントロールからローカル保存
□投稿者/ senamoon (1回)-(2021/03/26(Fri) 21:43:36)

分類:[.NET 全般] 

現在、WPFのimageコントロールにUSBカメラで取得した画像を高速で表示させる処理を行なっています。
ボタンを押すと、別のimage2コントロールにimage2.sorce=image.sorceで出力させているのですが、
ボタン2を押せば、imageaコントロールに入った画像を指定のローカルフォルダに保存させたいのですが、なかなかうまくいきません。
どのように実装すれば良いかご教示いただけますと幸いです。
[ □ Tree ] 返信 編集キー/

▲[ 97100 ] / ▼[ 97102 ]
■97101 / 1階層)  Re[1]: WPFのImageコントロールからローカル保存
□投稿者/ 通りすがり (6回)-(2021/03/26(Fri) 23:10:07)
何がどううまくいかないのか説明して下さい。

以下を参考にどうぞ
https://stackoverflow.com/questions/5963172/how-can-i-save-the-picture-on-image-control-in-wpf
[ 親 97100 / □ Tree ] 返信 編集キー/

▲[ 97101 ] / ▼[ 97104 ]
■97102 / 2階層)  Re[2]: WPFのImageコントロールからローカル保存
□投稿者/ senamoon (3回)-(2021/03/27(Sat) 13:31:47)
No97101 (通りすがり さん) に返信
> 何がどううまくいかないのか説明して下さい。
>
> 以下を参考にどうぞ
> https://stackoverflow.com/questions/5963172/how-can-i-save-the-picture-on-image-control-in-wpf

using(FileStream stream = new FileStream("Temp/test.bmp", FileMode.Create)
{
ImageSource source = image2.Source;
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((Bitmapsource)source));
encoder.Save(stream);
}

上記コードのFrames.Addのsourceで、別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません、とエラー落ちします。
そのほか、RenderRangeBitamapなどで一度bitmap化してみたりと試してみましたが、進捗がなくお手上げ状態です。

そもそも、image.sourceから取り出すこと自体が間違っているのでしょうか。
souceをbitmap等とbindingさせて、ボタンイベント時に元のbitmapから.saveした方が良いのでしょうか。
ただ、カメラ側の出力が60fps程度あるため、遅延などが気になっています。

基礎知識が欠落しているため、的外れな質問をしてしまっていたら、申し訳ありません。
よろしくお願いいたします。
[ 親 97100 / □ Tree ] 返信 編集キー/

▲[ 97102 ] / 返信無し
■97104 / 3階層)  Re[3]: WPFのImageコントロールからローカル保存
□投稿者/ Hongliang (1160回)-(2021/03/27(Sat) 20:07:58)
例外メッセージにあるように、作成したスレッド以外でUI要素
(今回であればImageオブジェクト)に触ることはできません。
なのでBitmapSourceオブジェクトをImage.Sourceから確保するのは
UIスレッドのうちに済ます必要があります。

例えば:
private async void button1_Click(object sender, RoutedEventArgs e) {
    var bmp = (BitmapSource)image1.Source;
    await Task.Run(() => SaveImage(bmp));
}

[ 親 97100 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -