2013-07-19 21 views
7

Bazı görüntüleri yeniden boyutlandırmak için (org.imgscalr.Scalr) kitaplık kullanıyorum, ancak yeniden boyutlandırıldıktan sonra arka plan kırmızıya dönüyor. Benim kodum:Arka plan kırmızısı ile imgscalr

BufferedImage imagemPng = ImageIO.read(image); 
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937); 

Yardımcı olabilir misiniz?

teşekkür ederiz

+0

Bu soruyu tamamen sordunuz. –

+0

Muhtemelen, png'den jpg'ye giden şeffaf arka plan ile ilgili olması muhtemeldir. –

+0

Renk arka planı ayarlamak için bir şey var mı? –

cevap

18

atladığımız (ImageIO kaydetmek) ve kod kalanı içeri okuduğunuz PNG (@Daft Punk belirttiği gibi) şeffaf bir kanal ya da değil sahip önemli bit burada ise.

PNG'nizin bir alfa kanalı içerdiğini ve JPG'nin alfa desteklemediğini 1 dolar yatırmaya hazırım; Ne yazık ki Java'nın JPG kodlayıcısı, girdiğiniz bir BufferedImage'deki alfa kanalını görmezden gelmez ve gerçek renk kanallarından birini (R/G/B), bu renk kanallarından biri yerine alfa değerlerini yazmaktan atar. . Örneğin

, varsa:

[ARG] 

ve MAVİ kanalı atın:

ARGB 

Java JPG kodlayıcı düşünme Aşağıdaki 3 kanallara göz yazacak onlar RGB vardır.

Neyse ki, düzeltme son derece basit. Sadece şöyle tip TYPE_INT_RGB yeni BufferedImage oluşturun: Şimdi

Graphics g = imageToSave.getGraphics(); 
g.drawImage(imagemJpg, 0, 0, null); 

şunları yapabilirsiniz:

BufferedImage imageToSave = new BufferedImage(imagemJpg.getWidth(), imagemJpg.getHeight(), BufferedImage.TYPE_INT_RGB); 

o zaman, buna bir Alpha kanalı ile BufferedImage "işlemek" Alpha kanalı çıkartmanız gerekmektedir Ortaya çıkan imageToSave görüntüsünü bir JPG olarak kaydedin ve iyi görünecektir.

İPUCU: Eğer resim görünüyor (bulanık, artifacted, vs.) yol beğenmezseniz bunu sıkıştırmak değil bunu söylemek Java JPG kodlayıcı doğrudan bağımsız değişkenler geçmesi gerekiyor, unutma çok (read this) - Bu nadiren bir sorundur, ama insanlar "imgscalr kötü görünüyor!" - BufferedImage'ın gerçekten güzel ve keskin olduğu ortaya çıkıyor, ancak Java kodlayıcı sonucu çok agresif bir şekilde sıkıştırıyor.

Imgscalr kütüphanesine bazı ek IO yardımcıları ekleyerek Java görüntüleri ile bu küçük can sıkıcı gotcha'lara hitap etmek istedim, böylece sadece dosyaları yükleyebilir ve kaydedebilir ve bu nitty cesur detaylar hakkında endişelenmeyin.

+0

Bu konuda uzmansınız. Sorun, görüntüyü png'den jpg'ye dönüştürdüğüm zamandı, ancak şimdi sorun çözüldü. Bu hata ile çok şey öğrendim. Çok teşekkür ederim! –

+0

Çok hoş geldiniz, yardımcı olabildiğime sevindim! –

+0

HI @RiyadKalla, Benzer bir sorunla karşı karşıyayım. Orijinal görüntüdeki alfa kanalını kontrol ederek hata ayıklamayı denedim, ancak her zaman false döndürür. Aynı Java ve işletim sistemine sahip iki sunucuda da aynı uygulamaya sahibim ve bir uygulama her zaman renkli arka planı üretiyor ve diğeri yeniden boyutlandırılan doğru görüntüyü üretiyor.Tomcat'i yeniden başlattığımda, sorunu giderir. Bunun neden olduğunu anlamak benim için gerçekten zor oluyor. Mümkünse herhangi bir anlayış sağlayabilir misiniz? Teşekkürler. –