Görüntülerin bir liste kutusuna sahip bir WPF uygulamasına sahibim. Şu anda görüntüleri yüklemek için BitmapImage ve BitmapCacheOption.OnLoad kullanıyorum. Sorun, görüntülerin büyüklüğünden dolayı RAM kullanım gökyüzü roketleri bir sürü resim olduğunda. Liste kutusunda görüntülenecek asılların küçük resimlerini nasıl oluşturabilirim? Uygulama çalışırken dizindeki görüntü dosyaları silinebileceği veya değiştirilebileceğinden muhtemelen önbelleğe alınması gerekir.Görüntülerin küçük resimlerini oluşturun ve önbelleğinde saklayın
cevap
:
_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;
}
}
MSDN'i denetledikten sonra bunu yapmak için herhangi bir doğrudan yöntem görmüyorum, ancak belki de her görüntüyü çok sayıda piksele örnekleyebilir ve verileri yeni bir görüntüye yazdırabilir ve sonra da tam boyutu birincisi temizleyebilirsiniz. istendiğinde Sen bir arka plan iş parçacığı başparmak oluşturuyorsanız sadece o tembel BitmapImage
oluşturmak için kullanabileceğiniz bir bellek akışı içine kaydedebilirsiniz 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);
}
kullanarak iyi başparmak bitmap oluşturamazsınız
Çok uzun zaman önce yazmayla ilgili size yardımcı olabilecek bir yöntem.
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();
}
Orijinal resimlerden ikili olarak geçiyorum ve görüntünün yaklaşık 160 piksel boyutunda olmasını sağladım.
Umut eder!
Sorun, görüntülerin büyüklüğünden dolayı RAM kullanımı gökyüzü roketleri çok fazla görüntü olduğunda ortaya çıkıyor. DecodePixelWidth ve DecodePixelHeight özellikleri arzu edilen düşük piksel boyutunda görüntü önbelleğe 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;
Not: 'den
C# örneği. Resmi küçük resim boyutuna sığacak şekilde genişletmek için ikisini de kullanın.
- 1. Android Eclipse Galeride depolanan görüntülerin küçük resimlerini sorgulama
- 2. iOS: video oynatmadan videonun süresini ve küçük resimlerini alın
- 3. Android'de Daha Küçük Sekmeler Oluşturun
- 4. Web.config değerlerini saklayın ve alın.
- 5. Görüntülerin yüklü olup olmadığını kontrol edin?
- 6. Görüntü minik resimlerini göstermek için QItemDelegate kullanın
- 7. S3'de depolanan görüntülerin ölçeklenmesi
- 8. Özel veriyi harici depolama biriminde saklayın
- 9. Elektron uygulaması içindeki dosyaları indirin ve saklayın
- 10. Sunucudan görüntü indirin ve SD kartta saklayın
- 11. Bir js dosyası için typescript ile küçük sdk oluşturun
- 12. oluşturun ve Clojure
- 13. Küçük güncellemeleri ve küçük yükseltmeleri otomatikleştirme
- 14. Oturumları nesnelerde saklayın Symfony 2
- 15. Android uygulamasında daha büyük resme ait Resim Küçük Resimsürünün Çıkartılması ve Kullanılması
- 16. Şablon önbelleğinde her şeyi nasıl listeleyebilirim?
- 17. Bir Travis deposunu saklayın
- 18. Android: SecretKey'i KeyStore'da saklayın
- 19. Javascript: tarayıcı pencere boyutlarını saklayın ve geri yükleyin
- 20. Alttan üste görüntülerin toplanması
- 21. Görüntülerin garip davranışı RecyclerView
- 22. Meteor: Görüntülerin önceden yüklenmesi
- 23. Görüntülerin veritabanına eklenmesi
- 24. Kullanıcı verilerini ayrı ayrı veritabanında saklayın
- 25. facebook API kullanarak albüm resimlerini nasıl alabilirim?
- 26. node.js ve gm
- 27. Görüntülerin dikey olarak hizalanması,
- 28. Symfony2'nin - görüntülerin
- 29. Google Chrome'un önbelleğe alınmış resimlerini görüntüleyin
- 30. .BMP dosyasının küçük resmi nasıl oluşturulur?
Harika! Bu, uygulamada görüntülerin çok daha hızlı yüklenmesini sağlıyor ve her görüntüyü tam boyutta işlememeye ve daha sonra tekrar tekrar ölçeklendirmeye ihtiyacım yok. – ygoe