With scroll bars and zoom

This commit is contained in:
knut 2007-04-08 19:12:41 +00:00
parent e77f61825e
commit c1498adc1f

View file

@ -20,163 +20,111 @@ import javax.swing.border.*;
public class Editor public class Editor
extends JComponent extends JComponent
{ {
// Given from input image
BufferedImage img; BufferedImage img;
double rotation; double imgScale; // coordinates per bitmap pixel
Rectangle imgRec;
// What we choose
double rotation; // radians
Rect roi; // Measured in coordinates
double scale; double scale;
Rectangle region; int side;
Dimension displaySize;
AffineTransform t;
// other
// AffineTransform t;
CropFrame mask; CropFrame mask;
Rectangle currentRect = null;
Rectangle rectToDraw = null;
Rectangle previousRectDrawn = new Rectangle();
public Editor(BufferedImage img) { public Editor(BufferedImage img) {
this.img = img; this.img = img;
rotation = 0; // 135.0;
displaySize = new Dimension(480, 300);
int w = img.getWidth(); int w = img.getWidth();
int h = img.getHeight(); int h = img.getHeight();
imgScale = 1d / Math.sqrt(w * w + h * h);
imgRec = new Rectangle(0, 0, w, h);
scale = Math.min(displaySize.width, displaySize.height) resize(imgScale * 680);
/ Math.sqrt(w * w + h * h); /*
Dimension size = new Dimension(680, 680);
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
t = new AffineTransform(); roi = new Rect();
t.translate(displaySize.width/2.0, displaySize.height/2.0); roi.top = 0.5;
t.scale(scale, scale); roi.bottom = -0.5;
t.translate(-w/2.0, -h/2.0); roi.left = -0.5;
Point topLeft = new Point(0, 0); roi.right = 0.5;
Point topLeft1 = new Point();
Point bottomRight = new Point(w, h);
Point bottomRight2 = new Point();
t.transform(topLeft, topLeft1);
t.transform(bottomRight, bottomRight2);
Dimension d = new Dimension((int)Math.round(bottomRight2.getX() - topLeft1.getX() + 1),
(int)Math.round(bottomRight2.getY() - topLeft1.getY() + 1));
Rectangle imgRec = new Rectangle(topLeft1, d);
log("rect: " + imgRec);
rotation = 0.0;
Rectangle initialMask = new Rectangle(100, 100, 200, 200);
mask = new CropFrame(); mask = new CropFrame();
add(mask); mask.setBounds(initialMask);
mask.setBounds(imgRec);
mask.setVisible(true); mask.setVisible(true);
setPreferredSize(displaySize);
MyListener ml = new MyListener();
addMouseListener(ml);
addMouseMotionListener(ml);
mask.addMouseListener(mask); mask.addMouseListener(mask);
mask.addMouseMotionListener(mask); mask.addMouseMotionListener(mask);
add(mask);
SelectionEditor ml = new SelectionEditor();
addMouseListener(ml);
addMouseMotionListener(ml);
*/
} }
AffineTransform render() { void resize(double newScale) {
int w = img.getWidth();
int h = img.getHeight();
scale = Math.min(displaySize.width, displaySize.height) scale = newScale;
/ Math.sqrt(w * w + h * h); side = (int)Math.round(scale / imgScale);
Dimension size = new Dimension(side, side);
t = new AffineTransform(); setSize(size);
setPreferredSize(size);
t.translate(displaySize.width/2.0, displaySize.height/2.0); setMinimumSize(size);
t.scale(scale, scale); setMaximumSize(size);
t.rotate(rotation * Math.PI / 180); revalidate();
t.translate(-w/2.0, -h/2.0); repaint();
return t;
} }
VolatileImage dst;
protected void paintComponent(Graphics g1) { protected void paintComponent(Graphics g1) {
super.paintComponent(g1); super.paintComponent(g1);
if (getWidth() != displaySize.width Graphics2D g = (Graphics2D)g1;
|| getHeight() != displaySize.height AffineTransform orig = g.getTransform();
|| t == null || dst == null)
{ AffineTransform screenToCoord = new AffineTransform();
displaySize.width = getWidth(); screenToCoord.translate(side/2d, side/2d);
displaySize.height = getHeight(); screenToCoord.scale(side, side);
AffineTransform dxf = render();
g.transform(screenToCoord);
AffineTransform imageToCoord = new AffineTransform();
imageToCoord.rotate(rotation * Math.PI / 180d);
imageToCoord.scale(imgScale * scale, imgScale * scale);
imageToCoord.translate(-img.getWidth()/2d, -img.getHeight()/2d);
g.drawImage(img, imageToCoord, this);
// Crosshair
g.setStroke(new BasicStroke(0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1f, new float[] { 0.005f, 0.005f }, 0));
g.draw(new Line2D.Double(-0.5, 0, 0.5, 0));
g.draw(new Line2D.Double(0, -0.5, 0, 0.5));
g.setTransform(orig);
g.setXORMode(Color.white); //Color of line varies
g.setStroke(new BasicStroke(0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1f, new float[] { 5f, 5f }, 0));
g.draw(new Rectangle2D.Double(100, 100, 200, 200));
dst = createVolatileImage(getWidth(), getHeight());
Graphics2D g = dst.createGraphics();
g.drawRenderedImage(img, dxf);
}
g1.drawImage(dst, 0, 0, dst.getWidth(), dst.getHeight(), this);
} }
void drawWireframe(Graphics2D g, int w, int h) {
double delta = Math.round(Math.sqrt(w * w + h * h) / 20);
//
// 0------------4------------1
// | /|\ |
// | 6 | 7 |
// | | |
// | 5 |
// | 8 |
// | | |
// | 10-+-11 |
// | | |
// | 9 |
// | |
// | |
// | |
// | |
// 3-------------------------2
double[] wireFramePoints = new double[] {
0, 0,
w, 0,
w, h,
0, h,
w/2, 0,
w/2, 3 * delta,
w/2 - delta, delta,
w/2 + delta, delta,
w/2, h/2 - delta,
w/2, h/2 + delta,
w/2 - delta, h/2,
w/2 + delta, h/2
};
float[] screen = new float[wireFramePoints.length]; private class SelectionEditor extends MouseInputAdapter {
int[] x = new int[wireFramePoints.length / 2];
int[] y = new int[wireFramePoints.length / 2];
t.transform(wireFramePoints, 0, screen, 0, x.length);
for (int i = 0; i < x.length; ++i) {
x[i] = Math.round(screen[2*i]);
y[i] = Math.round(screen[2*i + 1]);
}
g.setColor(Color.BLUE);
g.drawPolygon(x, y, 4);
g.drawLine(x[4], y[4], x[5], y[5]);
g.drawLine(x[4], y[4], x[6], y[6]);
g.drawLine(x[4], y[4], x[7], y[7]);
g.drawLine(x[8], y[8], x[9], y[9]);
g.drawLine(x[10], y[10], x[11], y[11]);
}
private class MyListener extends MouseInputAdapter {
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
int x = e.getX(); int x = e.getX();
@ -224,8 +172,6 @@ public class Editor
if (value != previousValue) { if (value != previousValue) {
previousValue = value; previousValue = value;
rotation = value; rotation = value;
t = null;
// render();
repaint(); repaint();
} }
} }
@ -240,7 +186,6 @@ public class Editor
boolean value = renderQualityControl.isSelected(); boolean value = renderQualityControl.isSelected();
if (value != previousValue) { if (value != previousValue) {
previousValue = value; previousValue = value;
render();
repaint(); repaint();
} }
} }
@ -248,6 +193,23 @@ public class Editor
hp.add(renderQualityControl); hp.add(renderQualityControl);
hp.add(new JLabel("Zoom"));
final JSlider zoomSlider = new JSlider(1, 300, (int) Math.round(scale * 100));
zoomSlider.setPaintTicks(true);
zoomSlider.setMajorTickSpacing(10);
zoomSlider.addChangeListener(new ChangeListener() {
int previousValue = 0;
public void stateChanged(ChangeEvent e) {
int value = zoomSlider.getValue();
if (value != previousValue) {
previousValue = value;
resize(value * 0.01);
}
}
});
hp.add(zoomSlider);
hp.add(new JPanel()); hp.add(new JPanel());
return hp; return hp;
@ -276,7 +238,7 @@ public class Editor
Container c = frame.getContentPane(); Container c = frame.getContentPane();
c.setLayout(new BorderLayout()); c.setLayout(new BorderLayout());
c.add(x.createControlPanel(), BorderLayout.EAST); c.add(x.createControlPanel(), BorderLayout.EAST);
c.add(x, BorderLayout.CENTER); c.add(new JScrollPane(x), BorderLayout.CENTER);
frame.pack(); frame.pack();
frame.setVisible(true); frame.setVisible(true);
@ -468,6 +430,12 @@ public class Editor
} }
static class Rect {
double top;
double left;
double bottom;
double right;
}
} }
// eof // eof