2016-04-03 12 views
1

Resimleri Facebook'tan, Instagram'dan veya cihazdan kırpmam gerekiyor. Kullanıcı akışının sonunda (onları seçtiği yerde), tüm görüntüler sunucuya gönderilmelidir. Ancak hepsi aynı genişlik/yükseklik oranında (ör. 3/2), bu yüzden görüntüleri elle kırpmam gerekiyor. İşteBellek Dışı Durum istisnası olmadan bitmapler yükleniyor ve kırpıyor

Yüklemem hizmetinde oluyor ve kırpma ne basit bir örnek: Sonra dosya sistemi bu dosyayı okumak ve arka uçta göndermek için BASE64 kodlamak

Bitmap bitmap = ImageLoading.getLoader(UploadService.this).loadImageSync(path); 
//crop calculations 
Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, x, y, w, y); 
String croppedPath = saveCroppedImage(croppedBitmap); 

.

Birden çok görüntü için bunu yapmak zorunda kaldığımda, düzenli olarak bir OOM özel durumu alıyorum. Belki de yanlış yöne gidiyorum .. Sunucu tarafında kırpmak gerçekten yapmak istediğim en son şey, çünkü arka ucun Facebook ya da Instagram'ı sorgulaması gerekiyordu.

Bitmap'in ölçeklenmiş bir sürümü yükleme bir seçenek değildir, cihazda görüntülemiyorum.

denedim:

  • System.gc()
  • Bitmap.recycle();
  • Gerçekten manifoldumda bigHeap kullanmalı mıyım?

not: Kullanıcı akışı için Evrensel Resim Yükleyici kullanıyorum, bu yüzden yükleme hizmetinde de kullanıyorum.

+1

GC sizin sorununuz değil. Android yığınları parçalara ayrılıyor; Tahsis talebini karşılamak için yeterince büyük tek serbest blok yoktur. Bitmap nesnelerini yeniden kullanmaya çalışın (bkz. BitmapFactory.Options 'deki inBitmap), UIL'yi kullanmak yerine görüntü yüklemesini kendiniz yapmanız gerekebilir. İdeal olarak, resmin başka bir kopyasını oluşturmayı gerektirmeyen kırpma işlemini yapmanın bir yolunu bulacaksınız ('createBitmap()' nin yaptığı gibi). Ayrıca, size yardımcı olmak için 'saveCroppedImage()' da yapabileceğiniz şeyler olabilir. – CommonsWare

+0

Yorumunuz için teşekkür ederiz! saveCroppedImage() sadece bir FileOutputStream kullanır ve PNG 100'e sıkıştırır. Kalite kaybını gerçekten karşılayamam. InBitmap'e bir göz attım, ancak farklı görüntü boyutlarının kullanımını kısıtlıyor gibi görünüyor. –

+1

"InBitmap'e bir baktım, ancak farklı görüntü boyutlarının kullanımını kısıtlıyor gibi görünüyor" - API Level 19+ daha fazla esneklik sunuyor, ancak evet, sınırlı. Öte yandan, NDK'yı kullanmaya başlamak ve C/C++ ile görüntü kırpma yapmak istemediğiniz sürece pek çok seçeneğiniz olmayabilir. – CommonsWare

cevap

0

AndroidManifest dosyasında largeHeap = true eklemelisiniz.

İkinci olarak, Universal ImageLoader kullanıyorsanız, bitmapi daha küçük boyutlu olarak indirebilirsiniz.

ImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this size 
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options); // This bitmap will be of specified size. 

Sen ayrıca bağlantıyı izleyerek yaklaşık Universal Image Loader okuyabilirsiniz: Bu kod bir göz atın.

+0

Bitmap'in daha küçük bir sürümünü yüklemek burada bir seçenek değildir korkarım. Onlara tam kalitede ihtiyacımız var. LargeHeap kullanmam gerektiğini düşündüm, ama kirli bir kod gibi görünüyor. –

İlgili konular