With scroll bars and zoom
This commit is contained in:
parent
e77f61825e
commit
c1498adc1f
1 changed files with 93 additions and 125 deletions
|
|
@ -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)
|
|
||||||
{
|
|
||||||
displaySize.width = getWidth();
|
|
||||||
displaySize.height = getHeight();
|
|
||||||
AffineTransform dxf = render();
|
|
||||||
|
|
||||||
|
AffineTransform screenToCoord = new AffineTransform();
|
||||||
|
screenToCoord.translate(side/2d, side/2d);
|
||||||
|
screenToCoord.scale(side, side);
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue