2012-03-17 41 views
5

我只是想将JPG文件旋转90度。但是,我的代码输出完全黑色的图像(BufferedImage)。带有AffineTransform的Java图像旋转输出黑色图像,但在调整大小时效果不错

这里重现的方式:(下载3.JPG here

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")); 

} 

这里有什么错?

(如果我给这个黑色输出BufferedImage的图像缩放库,它就会调整好了,原始图像仍然存在。)

回答

13

传递一个新的BufferedImage进入过滤器()方法,而不是让它打造自己的作品(不完全是黑色)。

此外,转换似乎没有正常工作,图像结束在目的地偏移。我能够通过手动应用必要的翻译来修复它,请注意这些工作的顺序相反,并且在目标图像中width =旧高度,height =旧宽度。

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); 

用于过滤的Javadoc()指出,它会创建一个BufferedImage为你,我仍然不能确定为什么这是不行的,必须有一个在这里的问题。

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

如果你开到使用第三方LIB(非常小,只有2类)imgscalr能为你在一个单一的线,而工作周围所有的过滤器陷阱做到这一点的想法,不同的图像类型可以原因。

使用Scalr.rotate(...)会是这个样子:

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

如果这种旋转是一个较大的应用程序,处理图像的一部分,你甚至可以做到这一点异步,如果你需要的(AsyncScalr class)。

imgscalr是在Apache 2许可下,所有源都可用;如果你想亲自做这个,请阅读code for the rotate() method,我已经记录了在Java2D中使用过滤器时可能出现的所有问题。

希望有帮助!