2015-08-28 19 views
8

Uygulamamdaki pdf'yi görüntülemek için api 21'in üzerinde PdfRenderer kullanıyorum ve sayfaların kalitesinin çok düşük olduğunu farkettim. Ben sayfası için Bitmap oluşturmak nasıl da PdfRenderer kullanılacak örnek google izlediğimiz ve şu: olarak bildiğim kadarıyla, bu bitmapleri görüntülemek için en kaliteli çünkü Android'in PdfRenderer sınıfı düşük kaliteli görüntüler üretiyor

//mCurrentPage is a PdfRenderer.Page and mImageView is an ImageView 
Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), 
        mCurrentPage.getHeight(), 
        Bitmap.Config.ARGB_8888); 
mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); 
mImageView.setImageBitmap(bitmap); 

ben ARGB_8888 kullandı. Yanlış bir şey yapıyorum?

DÜZENLEME

Bu PdfRenderer sınıfı ve klasik bir PDF okuyucu arasında büyük bir fark:

enter image description hereenter image description here

+0

Odağı yakınlaştırıp uzaklaştırdıktan veya odağı açıp kapattıktan sonra pdf kalitesi değişiyor mu? – Sipty

+1

@Sipty No, değil. –

+0

Sınıfın ne kadar kısıtlı olduğu korkutucu! Bitmap kalitesini arttırmak için birkaç başka yöntemle birlikte AA uygulamanızı öneririm. Bu işe yaramazsa, bir sonraki en iyi adım, bir dış lib için seçmen için olabilir. Tahminimce, Android kullanıcıları subpixel oluşturma ve/veya belirli yazı tipleriyle ilgili bir sorun değil. Dışarıda bazı fantastik kütüphaneler var, bu da size ekstra kullanışlı seçenekler sunacak. – Sipty

cevap

27

ARGB_8888` renk kalitesi yalnızca ancak baskı için/gösteren kalite ilgilidir Çözünürlüğe (ekranda görüntülendiğinde inç başına ne kadar noktaya kadar). Örneğin

, 400 DPI ekran (400 İnç Başına Nokta) ve daha sonra onun boyutları gibi pikselleri alır Bitmap.createBitmap() aracılığıyla bit eşlem işlemek gereken bu kalite ile PDF görüntülemek istiyorsanız:

Bitmap bitmap = Bitmap.createBitmap(
    getResources().getDisplayMetrics().densityDpi * mCurrentPage.getWidth()/72,       
    getResources().getDisplayMetrics().densityDpi * mCurrentPage.getHeight()/72, 
    Bitmap.Config.ARGB_8888 
); 

  1. getResources().getDisplayMetrics().densityDpi
  2. mCurrentPage.getWidth() döner her pt 1/72 inç Postscript nokta bölgesi genişliği, hedef DPI çözünürlüktür:

    .

  3. 72 (DPI) varsayılan PDF çözünürlüğüdür.

Bundan dolayı, # 2'ye 72'ye daldık ve DPI ile çarparak pikselleri elde ederiz. Başka bir deyişle, ekranın baskı aygıtının kalitesiyle eşleşmesi için varsayılan PDF çözünürlüğü 72 DPI olan görüntü boyutunu arttırmalısınız. Lütfen this post'u da kontrol edin?

+0

Anladım, cevabınız için teşekkürler, çok yardımcı oldu! –

+1

Eugene M - Harika cevap. Bir sorum var. Artık, kaliteyi arttırdığımda uygulama çok yavaşlıyor. Sanırım hafızam doldu. Bir çözüm biliyor musun? teşekkürler – Joolah

+0

@Joolah daha yüksek görüntü boyutu ve daha yüksek bellek miktarına yol açar. Tam görüntüyü oluştururken DPI'yi (inç başına nokta) azaltmak için oynayacağım –

0

Sen PDFViewer sınıfını, bunu hiç kullanılmamış çünkü kalitesi hakkında emin değilim kullanılarak this sample aşağıdaki deneyebilirsiniz, ama yine de ben biraz geç kaldım denemeye :)

4

olduğunu. İşaretlenen cevap bana yardımcı olmadı, çünkü bitmap büyüktü ve bu yüzden oluşturulamadı. Orijinal postayı buldum çünkü aynı soruna sahiptim, belki bu cevap benim durumumda başkalarına yardımcı olacaktır.

Kimseye oranını korurken, bitmap ölçeklendirme için akıllı bir çözüm olmadığını görmek için etrafında arama yaptı. Bu sitede rastladım: Gerçekten, malzeme karmaşık değildir

https://guides.codepath.com/android/Working-with-the-ImageView#scaling-a-bitmap

. (Bu nedenle uygulamada, ikiden fazla üretim hattının olduğu;)) yer anlaşılacağı gibi

int height = DeviceDimensionsHelper.getDisplayHeight(this); 
Bitmap scaledBitmap = BitmapUtil.scaleToFitHeight(bitmap, height); 

Benzer bir yardımcı/Util sınıfları eklendi: Sadece iki kod, ek çizgiler gerekli.ölçekleme sadece dönüş ölçekli genişlik bulmak için orijinal bitmap genişliği ile çarpılması ve bir faktör, elde etmek amacıyla orijinal bit eşlem yüksekliği Cihaz yüksekliği böler

context.getResources().getDisplayMetrics().widthPixels; 

yükseklik gelir.

Bu, Nexus 5 cihazımda mükemmel çalışır. Bunu birden fazla cihazda test edemedim, ancak sağlam bir çözüm gibi görünüyor.

+0

Gümüş mermi değil. ama kabul edilen cevaptan daha iyi. –