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.
Bu soruyu tamamen sordunuz. –
Muhtemelen, png'den jpg'ye giden şeffaf arka plan ile ilgili olması muhtemeldir. –
Renk arka planı ayarlamak için bir şey var mı? –