イメージのリストボックスを持つWPFアプリケーションがあります。今は、BitmapImageとBitmapCacheOption.OnLoadを使ってイメージをロードしています。問題は、たくさんの画像がある場合、RAMの使用量が画像のサイズのためにロケットになることです。リストボックスに表示するオリジナルのサムネイル画像を作成するにはどうすればよいですか?アプリケーションの実行中に、ディレクトリ内のイメージファイルが削除または変更される可能性があるため、キャッシュされている可能性があります。イメージのサムネイルを作成し、キャッシュに保存します。
5
A
答えて
2
:
_ms = new MemoryStream();
thumbBitmap.Save(_ms, ImageFormat.Png);
_ms.Position = 0;
ImageLoaded = true;
//thumb image property of this class, use in binding
public BitmapImage ThumbImage
{
get
{
if (_thumbImage == null && ImageLoaded)
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = _ms;
bi.EndInit();
_thumbImage = bi;
}
return _thumbImage;
}
}
0
MSDNを確認した後では、これを行う簡単な方法はありませんが、非常に多くのピクセルごとにイメージをサンプリングして新しいイメージに書き込んだり、フルサイズのイメージをクリーンアップしたりできます。要求されたときにあなたがバックグラウンドスレッドで親指を作成している場合は、単にあなたがなまけBitmapImage
を作成するために使用できるメモリストリームに保存InterpolationMode.HighQualityBicubic
Bitmap bitmap = ...
Bitmap thumbBitmap = new System.Drawing.Bitmap(thumbWidth, thumbHeight);
using (Graphics g = Graphics.FromImage(thumbBitmap))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bitmap, 0, 0, thumbWidth, thumbHeight);
}
を使用してまともな親指のビットマップを作成することができます
2
これはあまりにもずっと前にあなたが手伝ってくれた方法です。
byte[] IImageResizer.CreateThumbnailBytes(byte[] originalImage)
{
Image thumbnail = null;
Image tempImage = Image.FromStream(new MemoryStream(originalImage));
int desiredWidth = 160;
int newPixelWidth = tempImage.Width;
int newPixelHeight = tempImage.Height;
if (newPixelWidth > desiredWidth)
{
float resizePercent = ((float)desiredWidth/(float)tempImage.Width);
newPixelWidth = (int)(tempImage.Width * resizePercent) + 1;
newPixelHeight = (int)(tempImage.Height * resizePercent) + 1;
}
Bitmap bitmap = new Bitmap(newPixelWidth, newPixelHeight);
using (Graphics graphics = Graphics.FromImage((Image)bitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(tempImage, 0, 0, newPixelWidth, newPixelHeight);
}
thumbnail = (Image)bitmap;
MemoryStream ms = new MemoryStream();
thumbnail.Save(ms, ImageFormat.Jpeg);
return ms.ToArray();
}
私はオリジナルのイメージバイナリを渡し、およそ160px程度にイメージのサイズを変更します。
希望すると助かります!
4
問題は、画像がたくさんある場合、画像のサイズによってRAMの使用空が大きく変化することです。 DecodePixelWidthとDecodePixelHeight特性が所望の低減された画素サイズの画像をキャッシュするhttp://msdn.microsoft.com/en-us/library/ms748873.aspx
// Create source BitmapImage myBitmapImage = new BitmapImage(); // BitmapImage.UriSource must be in a BeginInit/EndInit block myBitmapImage.BeginInit(); myBitmapImage.UriSource = new Uri(@"C:\Water Lilies.jpg"); // To save significant application memory, set the DecodePixelWidth or // DecodePixelHeight of the BitmapImage value of the image source to the desired // height or width of the rendered image. If you don't do this, the application will // cache the image as though it were rendered as its normal size rather then just // the size that is displayed. // Note: In order to preserve aspect ratio, set DecodePixelWidth // or DecodePixelHeight but not both. myBitmapImage.DecodePixelWidth = 200; myBitmapImage.EndInit(); // //when you are ready to render the BitmapImage, do: imageThumb.Source = myBitmapImage;
注:から
C#の例。両方を使用してサムネイルサイズに合わせて画像を伸ばします。
関連する問題
- 1. サムネイルを保存せずに作成
- 2. 選択したビデオからサムネイルを作成し、サーバーに保存します
- 3. 画像をキャッシュに保存してイメージアレイを作成する(Swift)
- 4. mysqlに保存された画像からサムネイルを作成します
- 5. JavaScriptで新しいpngイメージを作成して保存する
- 6. jasperreport(iReportで作成)にイメージを追加した後のイメージの保存方法
- 7. HTML5では、イメージをプログラムでキャッシュに保存できますか?
- 8. イメージを保存するファイルを作成しようとしていますJava
- 9. コアデータにイメージを保存しますか?
- 10. コードネームワン - 大きなイメージから小さなイメージを作成して保存する
- 11. イメージはキャッシュに保存されません
- 12. イメージをキャッシュに保存する方法は?
- 13. イメージを保存します。GDI +エラー
- 14. データベースに保存されたhtmlコンテンツのサムネイル画像を作成する方法
- 15. 既存のイメージを繰り返してイメージを作成する
- 16. アプリケーションを終了した後にNSFetchResultsControllerキャッシュを保存します
- 17. 枕はアスペクト比を保存する代わりにトリミングでサムネイルを作成します
- 18. 特定のグレースケール値を保存したまま、サイズを変更してPythonでイメージを作成するには?
- 19. フォームを動的に作成し、データベースに保存します。
- 20. numpy.ndarrayをイメージとして保存し、ピクセル値を保存します。
- 21. イメージをfrom.asp urlに保存して保存する
- 22. イメージをキャプチャして内部のストレージに保存します
- 23. JxBrowser - キャッシュされたイメージを保存する
- 24. phpイメージをdirに保存してpdfに保存
- 25. djangoはgifを作成してDBに保存します
- 26. Emberjsは保存後に新しいモデルを作成します
- 27. 作成した画像をFTPに保存しますか?
- 28. .docファイルをイメージに変換してフォトアルバムに保存します
- 29. WARNING [キャッシュ]キーの保存に失敗しました
- 30. フォトアルバムからイメージを選択しながらイメージをコアデータに保存します
素晴らしい!これにより、アプリケーションの読み込み速度が大幅に向上し、フルサイズで各画像を処理してから再度スケールダウンする必要はありません。 – ygoe