2011-05-06 73 views
0

我试图旋转和图像的图像结果左,右90度。旋转腐败

出于某种原因,尽管在腐败这个过程的输出结果。

这里是我的代码:
(它的常规,但它并不需要多大的想象就假装它的Java)

void rotate(File file){ 
    def image = ImageIO.read(file); 
    double theta = Math.PI/2; 
    def w = image.width/2; 
    def h = image.height/2; 

    def transform = new AffineTransform(); 
    transform.rotate(theta, h, w); 
    def op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); 
    image = op.filter(image, null); 

    def name = file.getName(); 
    def type = name.substring(name.lastIndexOf(".") + 1, name.length()); 
    ImageIO.write(image,type,file); 
} 

原: enter image description here

旋转:enter image description here

回答

1

如果腐败你指的是颜色的变化,拿出过滤器。如果我正确理解语法,那会给你一个负面的形象。

每当我使用转换我离开过滤掉,并用手做他们。这确实需要很长时间,但它们总是变得更有用。只是一个建议。

+0

我真的不知道我在这里做,但是在丢弃过滤器,做'g.drawImage(origImg,transorm,NULL);'提请正确的东西为G – mkoryak 2011-05-06 15:07:09

+0

@mkyorak的方式你应用滤镜基本上是说采取一个像素的颜色,并乘以(是默认的?)这些值由相同的像素颜色。这样做会导致“负面”的形象。例如,叶子最暗的部分变得非常浅蓝色。 – Jon 2011-05-06 19:00:05

1

filter()方法需要srcdstBufferedImage,它们必须不同。

Image image = null; 
try { 
    image = ImageIO.read(new File("gZtC3.jpg")); 
} catch (IOException ex) { 
    ex.printStackTrace(System.err); 
} 
double theta = Math.PI/2; 
int w = image.getWidth(null); 
int h = image.getHeight(null); 
AffineTransform at = AffineTransform.getRotateInstance(theta, w/2, h/2); 
BufferedImage src = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
Graphics2D g = src.createGraphics(); 
g.drawImage(image, 0, 0, null); 
g.dispose(); 
AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BICUBIC); 
BufferedImage dst = op.filter(src, null); 
this.add(new JLabel(new ImageIcon(dst), JLabel.CENTER)); 
+0

感谢您的代码,但其实这有同样的问题,也是在你的榜样,你还在空传为第ARG过滤这是我做的。这似乎创建了另一个带有原始内容的缓冲图像,并写入其中。 – mkoryak 2011-05-06 15:05:29

+0

您的源尚未呈现呢,所以它的旋转而空。使用filter()对链接很好,但你接受的方法是正确的。比较这[Q&A](http://stackoverflow.com/questions/5864490/how-to-setsize-of-image-using-rescaleop/5864503)。 – trashgod 2011-05-06 18:01:53