2011-05-17 19 views
5

Görüntünün boyutlarını kontrol etmek ve genişliği belirli bir eşiği aştığında küçültmek istiyorum. ImageIO.read() ile 6MB JPEG bir görüntü yüklediğimde, BufferedImage yaklaşık 45 MB yığın alanı ayırır. Tüm verileri belleğe yüklemeden geçiş görüntüsünü yeniden boyutlandırmanın bir yolu var mı? ImageIO.read() dosyasını bir File nesnesinden geçirmeyi denedim, veriyi diskten aktaracağını düşünürdüm, ama yardımcı olmaz.Bir görüntü belleğe yüklenmeden nasıl yeniden boyutlandırılır?

cevap

3

kontrol dışarı im4java ve JMagick. Her ikisi de görüntü manipülasyonu için ImageMagick olarak adlandırılan son derece verimli bir harici alet kullanır. Im4Java, komut satırı uygulamasını çağırır (ayrı bir işlemde çalışır) ve JMagick, JNI aracılığıyla aynı işlem içinde bunu çağırır. Ben (döndürme, yeniden boyutlandırma, ölçekleme, vb) basit görüntü işleme yapıyorum Eğer

, ben daha ziyade ImageMagick benim için yapalım etmişti. Daha hızlı, daha güvenilir ve benzer bir süre içinde uyguladığınız her şeyden daha az bellek tüketir.

Bu yardımcı olur umarız!

+0

Teşekkürler Ben. Java için ImageMagick kitaplıklarını kontrol edeceğim. –

+1

Ben ile katılıyorum; yüksek verimlilik, gitmeniz gereken bir yol ise, yerel bir çözüm kullanarak ve Java ile çağırarak, muhtemelen gerçekleşecek tek yoldur. Görüntülerin yeniden boyutlandırılması aslında bir yeniden örnekleme işlemidir; bundan kaçamazsın. Yeniden örnekleme, bir piksel algoritması toplama ve ortalama piksel değerlerini gerektirir; Bunu Java'daki "parçalarda" yapmak, bir seferde bölümler halinde çekerek ImageReadParam'ın bir çok özel kod gerektirmesini, bunları örneklemesini ve sonuçların verimli bir şekilde birleştirilmesini gerektirecektir. Kısacası, * emecektir *. –

+0

Teşekkürler, Riyad! :-) –

1

Sen belleğe yüklenerek olmadan görüntünün genişliğini ve yüksekliğini kontrol etmek ImageInfo kullanabilirsiniz. Resmi belleğe yüklemeden yeniden boyutlandırmanızı sağlayacak bir kitaplık bilmiyorum. 45MB, o kadar çok hafıza değil. Sadece yığın büyüklüğünü artırabilir misin?

+9

... için küçük bir karşılaştırma bağlıdır "45MB tüm bu kadar değil". – EboMike

+1

Duydun! Yüksek eşzamanlılık ve bellek kısıtlı cihazlar için 45MB'lık bir hareket yok! –

+0

true. Hedef platformunuz 45 MB yüklemenize izin vermiyorsa, ayrı bir sunucuda görüntü ölçekleme yapmayı düşünebilirsiniz. – dennisjtaylor

3

Mükemmel sonuçlarla daha önce jmagick kullandım, ancak farklı ortamlarda çalışabilmeniz (kavanozları doğru yere yapıştırarak, doğru görüntü yapısına sahip olduğunuzdan emin olmanız vb.) Çok zor olabilir.

Sen imgscalr (http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library) kullanarak düşünebilirsiniz. Apache 2.0 lisansı altında açık kaynak, saf java görüntü işleme kütüphanesi. Çok fazla (çok ..) kullanımı daha kolay ve daha hızlı Java2D şeyler daha hızlı.

İlgili konular