2016-04-28 15 views
2

EXIF情報を使用して写真の向きを固定しようとしていますが、写真は正しく回転していますが、回転後は非常に低品質になります。違う。どんな助けもありがたい。AffineTransformを使用して画像を変換した後、写真が低品質になる

Before After

//code get Exif information 
Metadata metadata = ImageMetadataReader.readMetadata(outputFile); 
     Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); 
     if(directory == null) { 
      logger.warn("no EXIF info."); 
      outputFile.delete(); 
      return; 
     } 
     JpegDirectory jpegDirectory = metadata.getFirstDirectoryOfType(JpegDirectory.class); 
     int orientation; 
     try { 
      orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION); 
      if(orientation != 1) { 
       //rotate image 
       int w = jpegDirectory.getImageWidth(); 
       int h = jpegDirectory.getImageHeight(); 
       ImageInformation imageInformation = new ImageInformation(orientation, w, h); 
       AffineTransform affineTransform = getExifTransformation(imageInformation); 

       InputStream pictureStream = new FileInputStream(outputFile); 
       BufferedImage pictureBuffer = ImageIO.read(pictureStream); 
       pictureStream.close(); 
       if (pictureBuffer == null) { 
        logger.warn("The picture buffer parsed is null."); 
       } 
       pictureBuffer = transformImage(pictureBuffer, affineTransform); 


    //code do image transfer 
    public static BufferedImage transformImage(BufferedImage image, AffineTransform transform) throws Exception { 

    AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC); 
    BufferedImage destinationImage = op.createCompatibleDestImage(image, null); 
    Graphics2D g = destinationImage.createGraphics(); 
    g.setBackground(Color.WHITE); 
    g.clearRect(0, 0, destinationImage.getWidth(), destinationImage.getHeight()); 
    destinationImage = op.filter(image, destinationImage); 
    return destinationImage; 
} 
+0

私は、画質が劣化したとは思いませんほとんどのパターンは以前と同じくらい鮮明に見えます(ミルクボトルのエルク参照)。しかし、色が混ざり合って全体的な照明が減少したと言います。 – FiReTiTi

答えて

0

これはあなたの問題を解決することがあります。 AffineTransformOp

"If destCM is null, an appropriate ColorModel is used; this ColorModel may 
have an alpha channel even if the source ColorModel is opaque." 

によると、そのため私は、次のことをお勧め:

AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC); 
BufferedImage destinationImage = op.createCompatibleDestImage(image, null); 
destinationImage = op.filter(image, null); 
return destinationImage; 

、あるいは互換性のあるイメージ見送る:

AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC); 
BufferedImage destinationImage = op.filter(image, null); 
return destinationImage; 

はまた、私はバイキュービックは、すべてのことが重要であるか分からないが、5月問題ではない。

互換イメージがアルファのイメージを返すので、即ち、透明

この

Graphics2D g = destinationImage.createGraphics(); 
g.setBackground(Color.WHITE); 
g.clearRect(0, 0, destinationImage.getWidth(), destinationImage.getHeight()); 

は、画像上の透明の層を置きます。その後に塗られたイメージは白色と融合されます。すべて

1

おかげで、gpaschが正しいかもしれない、問題は、それはケースだ理由はわからない解決変更後これに変換関数を:-) 役立ちます

public static BufferedImage transformImage(BufferedImage image, AffineTransform transform) throws Exception { 

    AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC); 
    BufferedImage destinationImage = new BufferedImage(image.getWidth(),image.getHeight(), image.getType()); 
    destinationImage = op.filter(image, destinationImage); 
    return destinationImage; 
} 
関連する問題