ネットから画像を取得して順次表示する
-
11-07-2019 - |
質問
-
インターネットから取得した写真のスクロール可能なリストを作成し、ユーザーがクリックできるようにします。 WinForms / C#でそれを行うにはどうすればよいですか? listboxにpictureboxコントロールを追加することは可能ですか?
-
AutoScrollをtrueに設定して、PictureControlのリストをUserControlに追加しようとしました。これにより、listBoxを使用しているように感じます。これは正しいアプローチですか?
-
また、pictureBoxのImageLocationを画像のURIに設定し、Load()を呼び出して画像をロードしようとしましたが、動作しましたが、フォームがフリーズしています!フォームをフリーズせずに、各ピクチャボックスを順番に更新するにはどうすればよいですか?
ありがとう、 アズラム
解決
最初にあなたの3番目の質問に答えます。それは私が本当に答えを知っている唯一の質問だからです。ピクチャボックスにLoadAsync()メソッドがあり、画像を別のスレッドにロードし、アプリをハングさせません。
他の質問については、私もユーザーコントロールから始めて、そこに画像を配置する可能性が高いです。私が提案できる唯一のことは、最初に画像ボックスと、おそらくその横に複数行のテキストボックスまたはリッチテキストボックスを持つユーザーコントロールを作成することです。テキストボックスの境界線をオフにし、コントロール全体の周りにわずかな境界線を置きます。これにより、画像の横にテキストを表示できます。その後、実際の最終的なコントロールは、必要に応じて追加できるこれらのコントロールのコレクションになります。
-私の2セント...
他のヒント
垂直にスクロールしてもよろしいですか?
DataGridViewコントロールをベースとして開始し、次の実装を作成します。
1)DataGridViewImageColumnから派生するカスタム列とセルタイプを作成します。それらを" CronosNetImageColumn"、" CronosNetImageCell"と呼ぶことができます。
2)クラス" CronosImageDetails"を作成しますセルデータを保持する(表示テキストと画像のURLのプロパティを含む)。これは各セルの値として渡されます。例:
ImageGrid.Rows.Add(new CronosImageDetails {DisplayText =" Day at the Beach&quot ;, ImageURL =" http://...beach.jpg"});
3)WebClientを使用して画像を取得し、e.Graphics.DrawImage(ImageObtainedFromWebClient)を使用してセルに画像を描画するには、セルのPaint()をオーバーライドします。 e.Graphics.DrawString((CronosImageDetails)value.DisplayText、...)を使用して、セル内のテキストをオーバーレイできます。
この簡単な解決策は、ユーザーがリストをスクロールするときに画像のみをロードするスクロール画像リストを取得し、改善のための強固な基盤を提供します。
推奨されるさらなる最適化:
A)セルデータを描画するためのバックバッファビットマップとグラフィックを作成します。
B)Paint()をセットアップして、画像を取得する作業を行う代わりに、単にバックバッファをペイントします
C)イメージをダウンロードしてバックバッファーにペイントする新しいスレッドを生成する新しいセルメソッドLoadImage()を作成します。
D)Paint()(または別のヘルパースレッド)にスクロールの方向と加速を追跡させ、どのセルをプリロードする必要があるかを推定します。それらのセルでLoadImage()をトリガーします。
E)読み込みイメージで各セルのバックバッファーを初期化します。
F)画像の読み込み時間から経験的データを追跡して使用し、どのセルを事前に読み込む必要があるかを判断しやすくします。