2011-01-27 16 views
18

Android için bir resim işleme uygulamasında, müzik sayfalarından çekilen resimlerdeki müzik notasyonlarını tanıyorum.Tüm şeyi belleğe yüklemeden küçük parçalara bitmap kesmek mümkün mü?

Görüntüyü BitmapFactory.decodeFile(imgPath) yöntemini kullanarak bir Bitmap'e yüklemeyi denedim, ancak telefonumda yeterli bellek olmadığı için "VM yığın boyutu" hatası alıyorum. Bu konuda çalışmak için, tüm görüntüyü daha küçük parçalara ayırmak istiyorum, ama nasıl yapacağımı bilmiyorum.

Ayrıca BitmapFactory.Option sınıfının inSampleSize property'u kullanarak Bitmap'in bellek boyutunu küçültmenin mümkün olduğunu gördüm, ancak bunu yaparsam müzik notasyonu için ihtiyacım olan yüksek çözünürlüklü görüntüyü alamayacağım tanıma süreci.

NDK'ye gitmeden bunun üstesinden gelmek için herhangi bir yol var mı?

+0

gerçekten bitmap olarak kodlanmış dosya mı:

Sen örneği için şu yapardınız? Kaynak resmi sıkıştırır mısın? Sadece müzik için, birçok renge ihtiyacınız yok ... Birlikte çalıştığınız görüntüler bayt ve çözünürlükte ne kadar büyük? – Matt

+0

Bitmap sizin veya kullanıcının mı? Sizinki ise, önceden doğranmış ve/veya daha az renkte saklamayı düşünün. Kullanıcının, bu sınırda bir durum mu yoksa tipik bir girdi mi? Sınırda ise, doğrulama/zarif hata işleme kullanın. Tipik ise, platform seçiminizi tekrar gözden geçirin. –

+0

Bitmap kullanıcıdan alınmıştır. Resmi mobil kameradan çekecek. Mümkün olan en büyük bitmap'i kullanmam gerekiyor çünkü tanıma sürecinde etkinlik bundan kaynaklanıyor. Düzenleme ve kötü İngilizce'm için özür dilediğin için teşekkürler. – OffCS

cevap

1

Eğer bir fotoğraf makinesinden geliyorsa, görüntü büyük olasılıkla jpeg biçiminde olacaktır. Size daha iyi bir kontrol sağlamak ve bir kerede bir parça yüklemek için harici bir jpeg kütüphanesi - ya java'da ya da NDK üzerinden - ne olursa olsun kullanabilirsiniz. Eğer bir android.graphics.Bitmap olarak ihtiyacınız varsa, daha sonra alt-görüntüyü PNG veya JPEG olarak yeniden kodlamanız ve BitmapFactory.decodeByteArray()'a iletmeniz gerektiğinden şüpheleniyorum. (Bellek bir endişe varsa, çöp toplayıcının etkin bir şekilde çalışabilmesi için bitmap parçalarına ilişkin referanslarınızı unutmaya dikkat edin.)

Aynı teknik, giriş grafiği PNG formatındaysa veya Hemen hemen her şey için uygun kod çözme kodunu bulabilirsiniz sağladı.

Görüntüyü yükleyerek, kendinizi tam olarak hangi parçaların gerçekten ilgilendiğine karar vermek için kendinize algoritmik bir meydan okuma yerleştirdiğinizi düşünüyorum. BitmapFactory.Options'un, hangi bölgelerin tam ayrıntılı olarak yükleneceğine karar vermek için görüntünün genel görünümünü çözümlemek istiyorsanız yararlı olabilecek bir seçenek sunabileceğini fark ettim.

1

JPEG görüntüleri ile ilgileniyorsanız, this question cevabım yanı sıra this example cevabına bakın.

Android'de libijg'i elde etmenin ne kadar mümkün olduğunu bilmiyorum ama eğer öyleyse, bu bir çekim değerinde.

27

Android 2.3.3, android.graphics.BitmapRegionDecoder adlı yeni bir API'ye sahiptir ve tam olarak istediğiniz şeyi yapmanızı sağlar.

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false); 
Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null); 

Kolay :)

+0

Bu sınıf 2.3.3 ve bu sadece eğer 2.3 üzerinde çalışıyoruz uygulaması ile tamam .3 ve üstü, ancak önceki sürümler ne? –

+3

Git kodunu havuzdan alabilir ve uygulamanızda kullanabilirsiniz :) –

+0

@RomainGuy, bunu nasıl yapacağınıza biraz karar verebilir misiniz? Kod yerel yöntemlere başvurur gibi görünüyor. Ayrıca bu yerel yöntemleri git'ten almalı ve NDK ile derlemeliyiz mi, yoksa kendi başına yeterli olan java sınıfı mı? – snapfractalpop

İlgili konular