SORU
20 AĞUSTOS 2015, PERŞEMBE


En hızlı android bitmap yeniden boyutlandırmak için bir yol?

Görüntü aygıtı için sunucu tarafından gönderilir, görüntü yoğun sosyal bir uygulama inşa ediyorum. Cihaz daha küçük ekran çözünürlüğü, bit, cihaz, amaçlanan ekran boyutları uyacak şekilde yeniden boyutlandırmak gerekiyor.

Sorun kullanıyoruzcreateScaledBitmapbana küçük resimler bir kalabalık yeniden boyutlandırma sonra yetersiz bellek hataları çok fazla çalışmasına neden olur.

Android bitmap yeniden boyutlandırmak için en hızlı yolu nedir?

CEVAP
20 AĞUSTOS 2015, PERŞEMBE


Bu cevap Loading large bitmaps Efficientlyözetlenmiştir hangi inSampleSize aşağı ölçekli bir bitmap yüklemek için nasıl kullanılacağı açıklanır sürüm.

Özellikle Pre-scaling bitmaps çeşitli ayrıntılarını açıklıyor onları birleştirmek için nasıl, ve en fazla belleği olan yöntemler, verimli.

Farklı hafıza özelliklere sahip: Android üzerinde bir bitmap yeniden boyutlandırmak için üç güçlü yolu vardır

createScaledBitmap API

Bu API varolan bir bitmap ve seçtiğiniz kesin boyutları ile YENİ bir bit eşlem oluşturur.

Artı tarafta, tam görüntü boyutu elde edebilirsiniz (görünüyor nasıl olursa olsun) görünüyorsun. Ama kötü yanı,bu API gerektirirmevcutçalışmak için bit eşlem. Resim anlam yüklü, sorunsuz olması gerekir, ve bir bit eşlem, yeni, daha küçük bir versiyonu oluşturmak için güçlü olmak önce oluşturulmuş. Bu tam boyutlarını almak açısından ideal, ama ek bellek yükü açısından çok kötü. Gibi, bu tür bellek bilinçli olma eğilimi olan çoğu uygulama geliştiriciler için bir anlaşma kırıcı

inSampleSize flag

BitmapFactory.Options kod çözme sırasında görüntüyü yeniden boyutlandırmak için mal inSampleSize belirtildiği gibi, geçici bir bit eşlem çözmek için ihtiyaç önlemek için vardır. Bu tamsayı değeri burada kullanılan 1/x küçültülmüş boyutta bir görüntü yükleyecektir. Örneğin, 2 inSampleSize ayarı yarısı büyüklüğünde bir görüntü verir ve 4 ayarlamak 1/ 4 olan bir görüntü boyutunu verir. Temelde resim boyutları her zaman güç-of-iki kaynak daha küçük boyutta olacak.

Bellek bir bakış açısıyla, inSampleSize kullanarak çok hızlı bir işlemdir. Etkili, sonuç bit eşlem görüntü her piksel X. deşifre edecek. inSampleSize olsa ile: iki ana konu var

  • Kesin kararlar vermek değildir. Sadece 2 bazı güç tarafından kendi bit eşlem boyutunu azaltır.

  • En kaliteli yeniden boyutlandırma üretmek değil. En boyutlandırma filtreleri piksel blokları okuyarak iyi görünümlü görüntüler üretmek ve bunları söz konusu yeniden boyutlandırılan piksel üretmek için ağırlık. inSampleSize sadece her birkaç piksel okuyarak bütün bu engeller. Sonuç oldukça ölçülebilir ve düşük bellek, ancak kalite düşer.

Eğer sadece ve sadece ilgili küçülen resim tarafından bazı pow2 boyut ve filtreleme değil bir sorun, o zaman seni bulamıyorum daha hızlı (veya performans etkin) yöntem daha inSampleSize.

inScaled, inDensity, inTargetDensity flags

Eğer ihtiyacınız ölçekli bir görüntü için bir boyut değil eşit bir güç iki, sonra ihtiyacınız olacak inScaled, inDensity inTargetDensity bayrak BitmapOptions. inScaled bayrak ayarlandığında, sistem inDensity değerleri inTargetDensity bölerek sizin bitmap uygulamak için ölçeklendirme değeri elde edecek.

mBitmapOptions.inScaled = true;
mBitmapOptions.inDensity = srcWidth;
mBitmapOptions.inTargetDensity =  dstWidth;

// will load & resize the image to be 1/inSampleSize dimensions
mCurrentBitmap = BitmapFactory.decodeResources(getResources(), 
      mImageIDs, mBitmapOptions);

Bu yöntemi kullanarak yeniden boyut görüntü, hem de geçerli bir ‘yeniden boyutlandırma filtre’ için, yani sonuçta olacak bak daha iyi çünkü bazı ek matematik olmuştur hesaba sırasında yeniden boyutlandırma adım. Ama uyarayımekstra filtre adım, ekstra işlem zaman alırhızlı bir şekilde filtre için büyük görüntüleri yeniden boyutlandırır yavaş sonuçlanan , ve ekstra bellek ayırma için ekleyebilirsiniz kendisi.

Genellikle fazladan filtre yükü nedeniyle istediğiniz boyutu önemli ölçüde daha büyük bir resim için bu tekniği uygulamak için iyi bir fikir değil.

Sihirli Bir Kombinasyonu

Bellek ve performans açısından bakıldığında, en iyi sonuçlar için bu seçenekleri birleştirebilirsiniz. (, *, inDensity *inScaled18 ve inTargetDensity bayraklar ayar)

inSampleSize ilk resim için, hedef daha güç-of-iki BÜYÜK sonraki boyuta alma uygulanır. Daha sonra inDensity & inTargetDensity istediğiniz boyutları tam olarak ölçeklemek için, görüntüyü temizlemek için filtre işlemi uygulayarak kullanılır.

inSampleSize adım elde edilen Yoğunluk tabanlı adım uygulamak için gereken piksel sayısını azaltacak beri bu iki çok daha hızlı bir işlemdir birleştirerek, filtre boyutlandırma.

mBitmapOptions.inScaled = true;
mBitmapOptions.inSampleSize = 4
mBitmapOptions.inDensity = srcWidth;
mBitmapOptions.inTargetDensity =  dstWidth * mBitmapOptions.inSampleSize;

// will load & resize the image to be 1/inSampleSize dimensions
mCurrentBitmap = BitmapFactory.decodeFile(fileName, mBitmapOptions);

Eğer belirli boyutlarda resim sığdırmak için ihtiyacınız varsavebiraz daha iyi filtreleme, daha sonra bu tekniği doğru boyutu almak için en iyi köprü olduğunu, ancak, düşük bellek ayak izi hızlı bir operasyon yapıldı.

Resim boyutlarını alma

Tüm görüntü kodlama olmadan görüntü boyutunu almak Eğer bitmap yeniden boyutlandırmak için gelen boyutlarını bilmek gerekir. Resim, w/o aslında piksel verileri çözmek gerek boyutları olsun yardımcı olmak için inJustDecodeBounds bayrak kullanabilirsiniz.

// Decode just the boundries
mBitmapOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileName, mBitmapOptions);
srcWidth = mBitmapOptions.outWidth;
srcHeight = mBitmapOptions.outHeight;


//now go resize the image to the size you want

Bu bayrak boyutu ilk şifresini çözmek için kullanın ve hedef çözünürlüğüne Ölçekleme için uygun değerlerini hesaplamak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesomesauce Network

    Awesomesauce

    4 EKİM 2012
  • Creavite

    Creavite

    8 Mart 2009
  • Theodore Leaf

    Theodore Lea

    29 AĞUSTOS 2006