Re: How do you crop an image?
On Mar 24, 10:36 pm, "hiwa" <cardinal_r...@yahoo.co.jp> wrote:
On Mar 25, 11:24 am, "phillip.s.pow...@gmail.com"
<phillip.s.pow...@gmail.com> wrote:
Sorry that also failed:
No. You can't.
Post a small demo code that is generally compilable, runnable and
could reproduce your problem. See:http://homepage1.nifty.com/algafield/sscce.html
andhttp://www.yoda.arachsys.com/java/newsgroups.html
I'm sorry I can't fathom how to make a smaller example of my problem,
I honestly don't know how to do it, and it's 15 pages long. I will
just dump the whole thing. Copy and paste as you see fit and try. I
am truly sorry.
/*
* ImageCropper.java
*
* Created on March 23, 2007, 11:42 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.ppowell.tools.imagetools;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
/**
* ImageCropper an image
*
* @author Phil Powell
* @version JDK 1.6.0
* <a href="http://forum.java.sun.com/thread.jspa?
threadID=627125&messageID=3587532">Reference</a>
*/
public class ImageCropper
extends JFrame
implements ActionListener {
//----------------------------- --* PROPERTIES *--
---------------------------
// <editor-fold defaultstate="collapsed" desc=" Properties ">
/**
* {@link java.lang.Boolean}
*/
private boolean hasCropped = false;
/**
* {@link javax.swing.JTextField}
*/
private JTextField urlField;
/**
* {@link javax.swing.JButton}
*/
private JButton fileChooserButton;
/**
* {@link javax.swing.JButton}
*/
private JButton cropButton;
/**
* {@link javax.swing.JButton}
*/
private JButton restoreButton;
/**
* {@link javax.swing.JButton}
*/
private JButton saveButton;
/**
* {@link javax.swing.JPanel}
*/
private JPanel topPanel;
/**
* {@link javax.swing.JPanel}
*/
private JPanel bottomPanel;
/**
* {@link com.ppowell.tools.imagetools.ImageCropper.CropPanel}
*/
private ImageCropper.CropPanel cropPanel;
/**
* {@link com.ppowell.tools.imagetools.ImageCropper.CropSelector}
*/
private ImageCropper.CropSelector selector;
/**
* {@link com.ppowell.tools.imagetools.ImageCropper.Builder}
*/
private final ImageCropper.Builder builder = new
ImageCropper.Builder();
/**
* {@link com.ppowell.tools.imagetools.ImageCropper.Handler}
*/
private final ImageCropper.Handler handler = new
ImageCropper.Handler();
/**
* {@link com.ppowell.tools.imagetools.ImageCropper.Processor}
*/
private final ImageCropper.Processor processor = new
ImageCropper.Processor();
/**
* {@link com.ppowell.tools.imagetools.ImageCropper.LayoutManager}
*/
private final ImageCropper.LayoutManager manager = new
ImageCropper.LayoutManager();
/**
* {@link java.lang.Integer} default screen width
*/
protected static final int DEFAULT_SCREEN_WIDTH =
(int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
/**
* {@link java.lang.Integer} default screen height
*/
protected static final int DEFAULT_SCREEN_HEIGHT =
(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
// </editor-fold>
//---------------------------- --* CONSTRUCTORS *--
--------------------------
// <editor-fold defaultstate="collapsed" desc=" Constructors ">
/**
* Creates a new instance of ImageCropper
*/
public ImageCropper() {
super();
setup();
}
/**
* Creates a new instance of ImageCropper
*
* @param fileName {@link java.lang.String}
*/
public ImageCropper(String fileName) {
super();
this.fileName = fileName;
setup();
}
/**
* Creates a new instance of ImageCropper
*
* @param url {@link java.net.URL}
*/
public ImageCropper(URL url) {
super();
this.url = url;
setup();
}
/**
* Creates a new instance of ImageCropper
*
* @param file {@link java.io.File}
*/
public ImageCropper(File file) {
super();
this.file = file;
setup();
}
// </editor-fold>
//------------------------ --* GETTER/SETTER METHODS *--
---------------------
// <editor-fold defaultstate="collapsed" desc=" Getter/Setter
Methods ">
/**
* Retrieve {@link java.awt.image.BufferedImage}
* @return image {@link java.awt.image.BufferedImage}
*/
private BufferedImage getImage() {
if (getFileName() == null || getFileName().equals("")) {
setFileName("http://valsignalandet.com/images/
cemetery_potluck_3/flyer.jpg");
}
String fileName = getFileName();
BufferedImage image = null;
try {
URL url = new URL(fileName);
image = ImageIO.read(url);
} catch(MalformedURLException mue) {
System.err.println("url: " + mue.getMessage());
} catch(IOException ioe) {
System.err.println("read: " + ioe.getMessage());
}
return image;
}
// </editor-fold>
//---------------------------- --* OTHER METHODS *--
-------------------------
// <editor-fold defaultstate="collapsed" desc=" Methods ">
public void actionPerformed(ActionEvent evt) {
// SELECT IMAGE FROM URL
setFileName(evt.getActionCommand());
cropPanel.setImage(getImage());
validate();
}
// PERFORM CROP
if
(evt.getActionCommand().toLowerCase().trim().equals("crop")) {
processor.crop();
repaint();
hasCropped = true;
}
if
(evt.getActionCommand().toLowerCase().trim().indexOf("save") == 0) {
// SAVE NEW IMAGE
}
}
/** Initialize all components */
public void initComponents() {
fileChooserButton = new JButton("Select via File");
handler.handleButton(fileChooserButton, 'F');
cropButton = new JButton("Crop");
handler.handleButton(cropButton);
restoreButton = new JButton("Restore");
handler.handleButton(restoreButton);
saveButton = new JButton("Save as:");
handler.handleButton(saveButton);
urlField = new JTextField();
urlField.setText("Enter your image URL here: ");
urlField.addActionListener(this);
cropPanel = new CropPanel(getImage());
topPanel = new JPanel(true);
topPanel.setBackground(Color.WHITE);
bottomPanel = new JPanel(true);
bottomPanel.setBackground(Color.WHITE);
if (getScreenWidth() == 0)
setScreenWidth(ImageCropper.DEFAULT_SCREEN_WIDTH);
if (getScreenHeight() == 0)
setScreenHeight(ImageCropper.DEFAULT_SCREEN_HEIGHT);
setSize(getScreenWidth(), getScreenHeight());
builder.addToPanel();
builder.addToFrame();
}
/** Initialize all objects */
public void initObjects() {
selector = new CropSelector(cropPanel);
builder.addListeners();
}
/** Set up initialization routine */
protected synchronized void setup() {
initComponents();
initObjects();
builder.showFrame();
}
// </editor-fold>
//----------------------------- --* MAIN METHOD *--
--------------------------
// <editor-fold defaultstate="collapsed" desc=" Main Method ">
/**
* Main method
* @param args {@link java.lang.String}
*/
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (args.length > 0) {
new ImageCropper(args[0]);
} else {
new ImageCropper();
}
}
});
}
// </editor-fold>
//------------------------- --* NESTED INNER CLASSES *--
---------------------
// <editor-fold defaultstate="collapsed" desc=" Inner Classes ">
/**
* Build {@link com.ppowell.tools.imagetools.ImageCropper}
*
* @author Phil Powell
* @version JDK 1.6.0
*/
class Builder {
//---------------------------- --* METHODS *--
----------------------------
// <editor-fold defaultstate="collapsed" desc=" Methods ">
/**
* Add to {@link javax.swing.JFrame} descendant {@link
com.ppowell.tools.imagetools.ImageCropper}
*/
public void addToFrame() {
ImageCropper.this.add(topPanel);
ImageCropper.this.add(bottomPanel);
}
/** Add to both {@link #topPanel} and {@link #bottomPanel} */
public void addToPanel() {
ImageCropper.this.manager.layoutTopPanel();
ImageCropper.this.manager.layoutCropPanel();
ImageCropper.this.manager.layoutBottomPanel();
}
/**
* Add all appropriate listeners to {@link
com.ppowell.tools.imagetools.ImageCropper.CropPanel}
*/
private void addListeners() {
ImageCropper.this.cropPanel.addMouseListener(ImageCropper.this.selector);
ImageCropper.this.cropPanel.addMouseMotionListener(ImageCropper.this.selector);
}
/**
* Display {@link javax.swing.JFrame} descendant {@link
com.ppowell.tools.imagetools.ImageCropper}
*/
public void showFrame() {
ImageCropper.this.getContentPane().setBackground(Color.WHITE);
ImageCropper.this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageCropper.this.setVisible(true);
}
// </editor-fold>
}
/**
* {@link javax.swing.JPanel} to contain croppable image
* @author Phil Powell
* @version JDK 1.6.0
*/
class CropPanel extends JPanel {
//---------------------------- --* PROPERTIES *--
-----------------------
// <editor-fold defaultstate="collapsed" desc=" Properties ">
/**
* {@link java.awt.image.BufferedImage}
*/
private BufferedImage image;
/**
* {@link java.awt.Dimension}
*/
private Dimension size;
/**
* {@link java.awt.Rectangle}
*/
private Rectangle clip;
// </editor-fold>
//--------------------------- --* CONSTRUCTORS *--
----------------------
// <editor-fold defaultstate="collapsed" desc=" Constructors
">
/**
* Create a new instance of CropPanel
* @param image {@link java.awt.image.BufferedImage}
*/
public CropPanel(BufferedImage image) {
this.image = image;
this.setup();
}
// </editor-fold>
//----------------------- --* GETTER/SETTER METHODS *--
-----------------
// <editor-fold defaultstate="collapsed" desc=" Getter/Setter
Methods ">
/**
* Retrieve {@link #clip}
* @return clip {@link java.awt.Rectangle}
*/
public Rectangle getClip() {
return this.clip;
}
/**
* Retrieve {@link #image}
* @return {@link java.awt.Image}
*/
public BufferedImage getImage() {
return this.image;
}
@Override
/**
* Retrieve {@link #size}
* @return size {@link java.awt.Dimension}
*/
public Dimension getPreferredSize() {
return this.size;
}
/**
* Set {@link #clip}
* @param p1 {@link java.awt.Point}
* @param p2 {@link java.awt.Point}
*/
public void setClip(Point p1, Point p2) {
this.clip.setFrameFromDiagonal(p1, p2);
repaint();
}
/**
* Set {@link #image}
* @param image {@link java.awt.image.BufferedImage}
*/
public void setImage(BufferedImage image) {
this.image = image;
this.setup();
this.repaint();
}
// </editor-fold>
//--------------------------- --* OTHER METHODS *--
---------------------
// <editor-fold defaultstate="collapsed" desc=" Methods ">
/** Initialize all components */
public void initComponents() {
this.size = new Dimension(this.image.getWidth(),
this.image.getHeight());
this.clip = new Rectangle();
}
/** Initialize all objects */
public void initObjects() {
}
@Override
/**
* paintComponent
* @param g {@link java.awt.Graphics}
*/
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
int x = (w - this.size.width)/2;
int y = (h - this.size.height)/2;
g2.drawImage(this.image, x, y, this);
g2.setPaint(Color.red);
g2.draw(this.clip);
}
/** Set up initialization routine */
protected synchronized void setup() {
this.initObjects();
this.initComponents();
}
// </editor-fold>
}
/**
* Handling mouse actions to create "selector"
* @author Phil Powell
* @version JDK 1.6.0
*/
class CropSelector extends MouseInputAdapter {
//---------------------------- --* PROPERTIES *--
-----------------------
// <editor-fold defaultstate="collapsed" desc=" Properties ">
/** {@link java.lang.Boolean} */
private boolean hasSelected = false;
/**
* {@link com.ppowell.tools.imagetools.ImageCropper.CropPanel
*/
private CropPanel cropPanel;
/** {@link java.awt.Point} */
private Point start;
// </editor-fold>
//--------------------------- --* CONSTRUCTORS *--
----------------------
// <editor-fold defaultstate="collapsed" desc=" Constructors
">
/**
* Creates a new instance of CropSelector
*
* @param {@link
com.ppowell.tools.imagetools.ImageCropper.CropPanel}
*/
public CropSelector(CropPanel cropPanel) {
this.cropPanel = cropPanel;
}
// </editor-fold>
//------------------------------ --* METHODS *--
------------------------
// <editor-fold defaultstate="collapsed" desc=" Methods ">
@Override
/**
* Perform action upon pressing mouse
* @param evt {@link java.awt.event.MouseEvent}
*/
public void mousePressed(MouseEvent evt) {
if(evt.getClickCount() == 2) {
this.cropPanel.setClip(new Point(-1,-1), new
Point(-1,-1));
this.hasSelected = false;
}
this.start = evt.getPoint();
}
@Override
/**
* Perform action upon dragging mouse
* @param evt {@link java.awt.event.MouseEvent}
*/
public void mouseDragged(MouseEvent evt) {
this.cropPanel.setClip(this.start, evt.getPoint());
this.hasSelected = true;
}
// </editor-fold>
}
/**
* Handle components and objects
* @author Phil Powell
* @version JDK 1.6.0
*/
class Handler {
//----------------------------- --* METHODS *--
---------------------
// <editor-fold defaultstate="collapsed" desc=" Methods ">
/**
* Generic {@link javax.swing.JButton} handling
* @param button {@link javax.swing.JButton}
*/
private void genericButtonHandling(JButton button) {
button.setFocusable(false);
button.setSelected(false);
button.setFont(CropGlobals.FONT);
button.addActionListener(ImageCropper.this);
}
/**
* Handle each {@link javax.swing.JButton}
* @param button {@link javax.swing.JButton}
*/
private void handleButton(JButton button) {
this.genericButtonHandling(button);
button.setMnemonic(button.getText().charAt(0));
}
/**
* Handle each {@link javax.swing.JButton} with custom
mnemonic
* @param button {@link javax.swing.JButton}
* @param letter {@link java.lang.Character}
*/
private void handleButton(JButton button, char letter) {
this.genericButtonHandling(button);
button.setMnemonic(letter);
}
// </editor-fold>
}
/**
* Processor
* @author Phil Powell
* @version JDK 1.6.0
*/
class Processor {
public void crop() {
ImageCropper.this.cropPanel.setImage(
ImageCropper.this.cropPanel.getImage().getSubimage(
(int)ImageCropper.this.cropPanel.getClip().getX(),
(int)ImageCropper.this.cropPanel.getClip().getY(),
(int)ImageCropper.this.cropPanel.getClip().getWidth(),
(int)ImageCropper.this.cropPanel.getClip().getHeight()));
ImageCropper.this.cropPanel.setup();
ImageCropper.this.validate();
}
}
/**
* Layout manager
* @author Phil Powell
* @version JDK 1.6.0
*/
class LayoutManager {
//------------------------------ --* METHODS *--
------------------------
// <editor-fold defaultstate="collapsed" desc=" Methods ">
@Override
/** Layout {@link #bottomPanel} */
public void layoutBottomPanel() {
GroupLayout bottomPanelLayout = new
GroupLayout(ImageCropper.this.bottomPanel);
ImageCropper.this.bottomPanel.setLayout(bottomPanelLayout);
bottomPanelLayout.setHorizontalGroup(
bottomPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(bottomPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(ImageCropper.this.cropPanel,
GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
bottomPanelLayout.setVerticalGroup(
bottomPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(bottomPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(ImageCropper.this.cropPanel,
GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
GroupLayout layout = new
GroupLayout(ImageCropper.this.getContentPane());
ImageCropper.this.getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(ImageCropper.this.bottomPanel,
GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE,
GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(ImageCropper.this.topPanel,
GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(ImageCropper.this.topPanel,
GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ImageCropper.this.bottomPanel,
GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
ImageCropper.this.getContentPane().add(new
JScrollPane(ImageCropper.this.cropPanel));
}
/** Layout {@link #cropPanel} */
public void layoutCropPanel() {
GroupLayout cropPanelLayout = new
GroupLayout(ImageCropper.this.cropPanel);
ImageCropper.this.cropPanel.setLayout(cropPanelLayout);
cropPanelLayout.setHorizontalGroup(
cropPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGap(0, 390, Short.MAX_VALUE)
);
cropPanelLayout.setVerticalGroup(
cropPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGap(0, 204, Short.MAX_VALUE)
);
}
@Override
/** Layout {@link #topPanel} */
public void layoutTopPanel() {
JButton whichButton; // TO DETERMINE WHICH JButton YOU
WILL PLACE BASED ON CROPPING ACTION
if (ImageCropper.this.hasCropped) {
whichButton = ImageCropper.this.restoreButton;
} else {
whichButton = ImageCropper.this.cropButton;
}
GroupLayout topPanelLayout = new
GroupLayout(ImageCropper.this.topPanel);
ImageCropper.this.topPanel.setLayout(topPanelLayout);
topPanelLayout.setHorizontalGroup(
topPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(topPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(ImageCropper.this.urlField,
GroupLayout.PREFERRED_SIZE, 304, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ImageCropper.this.fileChooserButton)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
34, Short.MAX_VALUE)
.addComponent(whichButton)
.addGap(5, 5, 5)
.addComponent(ImageCropper.this.saveButton)
.addContainerGap())
);
topPanelLayout.setVerticalGroup(
topPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(topPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(topPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(ImageCropper.this.fileChooserButton)
.addComponent(whichButton)
.addComponent(ImageCropper.this.saveButton)
.addComponent(ImageCropper.this.urlField,
GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE))
.addContainerGap(23, Short.MAX_VALUE))
);
}
// </editor-fold>
}
// </editor-fold>
}