java 放大镜效果

坛里看到, 备忘一下
这里用到第三方库, 主要是做高斯模糊用的,



import com.jhlabs.image.GaussianFilter;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
*
* @date 05/02/2013
*/
public class Demo extends JPanel {

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {

JFrame f = new JFrame("Test");
f.setContentPane(new Demo());
f.pack();
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
private BufferedImage image;
private Image small;
private Point loc;
private int halfScaledSize;

Demo() {

try {

image = ImageIO.read(getClass().getResourceAsStream("2.png"));
small = image.getScaledInstance(image.getWidth() / 2, image.getHeight() / 2, Image.SCALE_SMOOTH);
halfScaledSize = small.getWidth(this) / 8;
loc = new Point(0, 0);
} catch (Exception e) {

throw new RuntimeException(e);
}

setPreferredSize(new Dimension(small.getWidth(this), small.getHeight(this)));

addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {

loc.x = e.getX();
loc.y = e.getY();
repaint();
}
});
}

@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(small, 0, 0, this);

int x = loc.x - halfScaledSize;
int y = loc.y - halfScaledSize;
int size = halfScaledSize * 2;

//绘制阴影
//BufferedImage shadow = getShadow(Color.BLACK, size + 6, 6);
//g.drawImage(shadow, x + 3, y + 3, this);

//抗锯齿
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//画白边(大一点的白背景)
g.setColor(Color.white);
g.fillRoundRect(x, y, size + 6, size + 6, size + 6, size + 6);

//画圆角图像
g.drawImage(getRenderedImage(image, loc.x * 2, loc.y * 2, size),
x + 3, y + 3, this);
}

private BufferedImage getShadow(Color c, int size, int blur) {

int fix = blur / 2;

BufferedImage result = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);

Graphics2D g = result.createGraphics();
g.setClip(new RoundRectangle2D.Double(fix, fix, size - blur, size - blur, size - blur, size - blur));
g.setColor(c);
g.fillRect(0, 0, result.getWidth(), result.getHeight());
g.dispose();

//GaussianFilter filter = new GaussianFilter(blur);
//result = filter.filter(result, result);

return result;
}

private BufferedImage getRenderedImage(
BufferedImage img, int x, int y, int size) {

BufferedImage result = new BufferedImage(
size, size, BufferedImage.TYPE_INT_ARGB);

Graphics2D g = result.createGraphics();
g.translate(-x, -y);
g.drawImage(img, 0, 0, null);
g.translate(x, y);

RoundRectangle2D round = new RoundRectangle2D.Double(0, 0, size, size, size, size);
Area clear = new Area(new Rectangle(0, 0, size, size));
clear.subtract(new Area(round));
g.setComposite(AlphaComposite.Clear);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.fill(clear);
g.dispose();
return result;
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现放大镜功能的核心思想是利用图形上下文的剪切区域以及图像的缩放功能。具体步骤如下: 1. 绘制原始图像。 2. 鼠标移动到需要放大的区域时,获取鼠标所在的像素点位置。 3. 根据鼠标位置计算出需要放大的区域的左上角坐标和右下角坐标。 4. 利用Graphics类的setClip()方法设置剪切区域。 5. 利用Graphics类的drawImage()方法绘制放大后的图像。 6. 绘制放大镜框架,可以使用JPanel或者JLabel等Swing组件。 7. 在放大镜框架上绘制放大后的图像。 8. 鼠标移出放大区域时,清除剪切区域和放大镜框架。 下面是一个简单的Java代码示例,实现了一个简单的放大镜功能: ``` import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; public class Magnifier extends JPanel implements MouseMotionListener { private BufferedImage image; private Rectangle clip; private int zoom = 2; public Magnifier(BufferedImage image) { this.image = image; addMouseMotionListener(this); } public void paintComponent(Graphics g) { super.paintComponent(g); if (clip == null) { return; } Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); BufferedImage zoomImg = new BufferedImage(clip.width * zoom, clip.height * zoom, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = zoomImg.createGraphics(); g2.setClip(0, 0, clip.width * zoom, clip.height * zoom); g2.drawImage(image, 0, 0, clip.width * zoom, clip.height * zoom, clip.x, clip.y, clip.x + clip.width, clip.y + clip.height, null); g2d.drawImage(zoomImg, 0, 0, clip.width * zoom, clip.height * zoom, null); g2d.setColor(Color.black); g2d.drawRect(0, 0, clip.width * zoom, clip.height * zoom); } public void mouseMoved(MouseEvent e) { int x = e.getX(); int y = e.getY(); clip = new Rectangle(x - 10, y - 10, 20, 20); repaint(); } public void mouseDragged(MouseEvent e) { mouseMoved(e); } public static void main(String[] args) { try { BufferedImage img = ImageIO.read(new File("image.jpg")); Magnifier magnifier = new Magnifier(img); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(magnifier); frame.setSize(300, 300); frame.setVisible(true); } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码中,程序利用Java AWT提供的类库绘制了一个放大镜,主要思路是在鼠标移动时,获取鼠标位置,并计算出需要放大的区域的左上角坐标和右下角坐标,然后利用Graphics类的setClip()方法设置剪切区域,再利用Graphics类的drawImage()方法绘制放大后的图像。最后,在放大镜框架上绘制放大后的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值