This is the program of resizing image on mouse wheel scroll. Here I am using image-scaling-library for resizing image, This library gives good quality scaled images. Display Image using JScrollPane to handle overflow of image situations.
Adding Panel to JScrollPane
JFrame frmImageZoomIn = new JFrame(); JScrollPane scrollPane = new JScrollPane(); frmImageZoomIn.getContentPane().add(scrollPane, BorderLayout.CENTER); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); scrollPane.setViewportView(panel);
Adding Image to Panel
Icon imageIcon = new ImageIcon(inputImage); label = new JLabel( imageIcon ); panel.add(label, BorderLayout.CENTER);
Zoom factor based on Mouse Wheel Scroll
Observe notches variable in below code. If user scrolls mouse wheel up then notches value will be -1 or else it will be 1. based on notches value zoom factor value be changed. Based on zoom factor value image will be scaled
public void mouseWheelMoved(MouseWheelEvent e) { int notches = e.getWheelRotation(); double temp = zoom - (notches * 0.2); // minimum zoom factor is 1.0 temp = Math.max(temp, 1.0); if (temp != zoom) { zoom = temp; resizeImage(); } }
Complete Java Code
Update inputImage variable with the your image file path and then run this code
import java.awt.EventQueue; import javax.imageio.ImageIO; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import java.awt.BorderLayout; import javax.swing.JPanel; import com.mortennobel.imagescaling.ResampleOp; import java.awt.event.MouseWheelListener; import java.awt.event.MouseWheelEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageZoom { private JFrame frmImageZoomIn; private static final String inputImage = "C:\\my-pfl-pic.jpg"; // give image path here private JLabel label = null; private double zoom = 1.0; // zoom factor private BufferedImage image = null; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ImageZoom window = new ImageZoom(); window.frmImageZoomIn.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the application. * @throws IOException */ public ImageZoom() throws IOException { initialize(); } /** * Initialize the contents of the frame. * @throws IOException */ private void initialize() throws IOException { frmImageZoomIn = new JFrame(); frmImageZoomIn.setTitle("Image Zoom In and Zoom Out"); frmImageZoomIn.setBounds(100, 100, 450, 300); frmImageZoomIn.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane scrollPane = new JScrollPane(); frmImageZoomIn.getContentPane().add(scrollPane, BorderLayout.CENTER); image = ImageIO.read(new File(inputImage)); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); // display image as icon Icon imageIcon = new ImageIcon(inputImage); label = new JLabel( imageIcon ); panel.add(label, BorderLayout.CENTER); panel.addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { int notches = e.getWheelRotation(); double temp = zoom - (notches * 0.2); // minimum zoom factor is 1.0 temp = Math.max(temp, 1.0); if (temp != zoom) { zoom = temp; resizeImage(); } } }); scrollPane.setViewportView(panel); } public void resizeImage() { System.out.println(zoom); ResampleOp resampleOp = new ResampleOp((int)(image.getWidth()*zoom), (int)(image.getHeight()*zoom)); BufferedImage resizedIcon = resampleOp.filter(image, null); Icon imageIcon = new ImageIcon(resizedIcon); label.setIcon(imageIcon); } }
how to fix com.mortennobel.imagescaling.ResampleOp package doesn`t exist error
ReplyDeleteException in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
ReplyDeleteat com.mortennobel.imagescaling.ResampleOp.doFilter(ResampleOp.java:165)
at com.mortennobel.imagescaling.AdvancedResizeOp.filter(AdvancedResizeOp.java:81)
at ImageZoom.resizeImage(ImageZoom.java:89)
at ImageZoom$2.mouseWheelMoved(ImageZoom.java:79)
at java.awt.Component.processMouseWheelEvent(Component.java:6627)
at java.awt.Component.processEvent(Component.java:6311)
at java.awt.Container.processEvent(Container.java:2239)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2297)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4564)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.awt.Container.dispatchEventImpl(Container.java:2283)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
at java.awt.EventQueue$4.run(EventQueue.java:733)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
I am getting above exception while running above code, what to do?