2012-03-17 12 views
5

Sadece bir JPG dosyasını 90 derece döndürmeye çalışıyorum. Ancak benim kodum tamamen siyah olan görüntüyü (BufferedImage) çıkarır.AffineTransform ile Java görüntü döndürme siyah görüntü çıktı, ancak yeniden boyutlandırıldığında iyi çalışıyor

private static BufferedImage transform(BufferedImage originalImage) { 
    BufferedImage newImage = null; 
    AffineTransform tx = new AffineTransform(); 
    tx.rotate(Math.PI/2, originalImage.getWidth()/2, originalImage.getHeight()/2); 

    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC); 
    newImage = op.filter(originalImage, newImage); 

    return newImage; 
} 

public static void main(String[] args) throws Exception { 
    BufferedImage bi = transform(ImageIO.read(new File(
      "3.jpg"))); 
    ImageIO.write(bi, "jpg", new File("out.jpg")); 

} 

burada sorun nedir (İndir here 3.jpg):

İşte çoğaltmak yolu? o geliştirmesine imkan yerine filtrenin() yöntemi yeni bir BufferedImage Geçme

(Ben image resizer kütüphanesine bu siyah çıktı BufferedImage verirsen, orijinal görüntü hala orada, iyi resized alır.)

cevap

13

onun kendi işleri (tamamen siyah değil). Ayrıca, dönüşüm doğru şekilde çalışmaz gibi görünmüyordu, görüntü, hedefte dengeleniyordu. Gerekli çevirileri manuel olarak uygulayarak, bu işi ters sırayla ve hedef görüntüde genişlik = eski yükseklik ve yükseklik = eski genişliği not ederek düzeltmeyi başardım.

AffineTransform tx = new AffineTransform(); 

// last, width = height and height = width :) 
tx.translate(originalImage.getHeight()/2,originalImage.getWidth()/2); 
tx.rotate(Math.PI/2); 
// first - center image at the origin so rotate works OK 
tx.translate(-originalImage.getWidth()/2,-originalImage.getHeight()/2); 

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); 

// new destination image where height = width and width = height. 
BufferedImage newImage =new BufferedImage(originalImage.getHeight(), originalImage.getWidth(), originalImage.getType()); 
op.filter(originalImage, newImage); 

filtre için javadoc()

ben hala bu neden çalışmıyor emin değilim, sizin için bir BufferedImage oluşturur bildiren, burada bir sorun olması gerekir.

If the destination image is null, a BufferedImage is created with the source ColorModel. 
5

bir 3. parti lib (çok küçük, sadece 2 sınıflar) çevresindeki tüm filtre FRİKİKLERİNDEN çalışırken imgscalr tek bir satırda sizin için bunu yapabilirsiniz kullanma fikri açık olsaydı o farklı resim türleri can sebeb olmak.

böyle bir şey olmazdı Scalr.rotate(...) kullanma: (AsyncScalr class) olduğunu gerekirse bu rotasyon görüntüleri işleyen daha büyük bir uygulamanın bir parçasıdır

BufferedImage newImage = Scalr.rotate(originalImage, Rotation.CW_90); 

varsa, hatta uyumsuz yapabilirsiniz.

imgscalr bir Apache 2 lisansı altındadır ve tüm kaynak kullanılabilir; Bunu kendi başınıza yapmayı tercih ederseniz, code for the rotate() method'u okuyun, Java2D'de filtrelerle çalışırken yayılan tüm tutacakları belgeledim.

Bu yardımcı olur umarım!

İlgili konular