2012-02-18 103 views
3

图像,我认为这个问题是相当自我explainitory,我想用一个JSlider就像在Windows Live照片库,例如实现一个简单的变焦功能。放大和缩小在Java中

我有一个快速浏览一下网上,但所有我试图使用的代码似乎在当我把它复制到Eclipse中的错误。我不想使用第三方库,因为应用程序可能以公司名称出售。另外,我begginning认识到,有可能是为了防止错误所需的一些安全precations,但我不知道这些会。

所以,如果有人能给我提供一些Java代码来放大和缩小图像,这将是grately赞赏。

在此先感谢

PS我打算使用图像作为JLabel将被添加到JScrollPane

回答

8

您可以轻松地通过使用规模达到这个将原始图像上。 假设您对当前图像宽度newImageWidth,以及当前图像高度newImageHeight,和当前缩放级别zoomLevel,您可以执行以下操作:通过

int newImageWidth = imageWidth * zoomLevel; 
int newImageHeight = imageHeight * zoomLevel; 
BufferedImage resizedImage = new BufferedImage(newImageWidth , newImageHeight, imageType); 
Graphics2D g = resizedImage.createGraphics(); 
g.drawImage(originalImage, 0, 0, newImageWidth , newImageHeight , null); 
g.dispose(); 

现在,取代原来的图像,originalImage,在显示区域resizedImage

+0

感谢GETAH,我已经有一个方法可以在我的代码中执行此操作,它只是没有点击它,它也可以用于此目的,但正如我刚刚测试的那样 - 显然它可以! – Andy 2012-02-18 15:51:04

+0

等待,这种方法似乎影响图像的透明度(透明位是黑色的),你有什么想法和更多的如何解决这个问题? – Andy 2012-02-18 15:55:01

+0

@Andy似乎使用AffineTransform应该保留图像的透明度...检查了这一点http://stackoverflow.com/a/2176977/782719 – GETah 2012-02-18 16:11:55

1

内的ImageIcon我建议你看看这些教程:

  1. Tutorial jinni
  2. Java tips
  3. Java2s

他们可能不是复制粘贴解决方案,但我认为他们是非常好的起点。 希望这些可以帮助你完成你打算做的事情。

问候

+0

谢谢你的教程。我已经看到了Java的技巧之一,但我有点困惑,因为它只是使图像更大或更小 - 是所有变焦是什么?如果是这样,标准的'getScaledImage'方法会做同样的事情吗? – Andy 2012-02-18 15:21:59

+0

我同意你关于Java技巧教程(我以为你正在寻找一个快速修复的解决方案),事实是,我没有阅读所有这些,但我认为第三个可能是你正在寻找。 – 2012-02-18 15:35:00

+0

由于我已经接受了GETAH的回答,我认为Java Tips教程中的代码现在就足够了。我只接受GETAH的回答,因为它对我来说更加方便直接,但是你的帮助非常大,所以非常感谢你! (事实证明,基本上所有的缩放是 - 因为某种原因,我认为这是一个非常复杂的操作) – Andy 2012-02-18 15:47:16

2

您也可以按如下 使用它:

public class ImageLabel extends JLabel{ 
    Image image; 
    int width, height; 

    public void paint(Graphics g) { 
     int x, y; 
     //this is to center the image 
     x = (this.getWidth() - width) < 0 ? 0 : (this.getWidth() - width); 
     y = (this.getHeight() - width) < 0 ? 0 : (this.getHeight() - width); 

     g.drawImage(image, x, y, width, height, null); 
    } 

    public void setDimensions(int width, int height) { 
     this.height = height; 
     this.width = width; 

     image = image.getScaledInstance(width, height, Image.SCALE_FAST); 
     Container parent = this.getParent(); 
     if (parent != null) { 
      parent.repaint(); 
     } 
     this.repaint(); 
    } 
} 

然后,你可以把它放在你的框架和与同放大倍数,为此我用百分比值放大的方法。

public void zoomImage(int zoomLevel){ 
    int newWidth, newHeight, oldWidth, oldHeight; 
    ImagePreview ip = (ImagePreview) jLabel1; 
    oldWidth = ip.getImage().getWidth(null); 
    oldHeight = ip.getImage().getHeight(null); 

    newWidth = oldWidth * zoomLevel/100; 
    newHeight = oldHeight * zoomLevel/100; 

    ip.setDimensions(newHeight, newWidth); 
}