mirror of
https://github.com/opencv/opencv.git
synced 2025-07-23 13:09:37 +08:00
133 lines
3.3 KiB
Java
133 lines
3.3 KiB
Java
package org.opencv.highgui;
|
|
|
|
import org.opencv.core.Mat;
|
|
import org.opencv.core.Size;
|
|
import org.opencv.imgproc.Imgproc;
|
|
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
|
|
/**
|
|
* This class was designed to create and manipulate
|
|
* the Windows to be used by the HighGui class.
|
|
*/
|
|
public final class ImageWindow {
|
|
|
|
public final static int WINDOW_NORMAL = 0;
|
|
public final static int WINDOW_AUTOSIZE = 1;
|
|
|
|
public String name;
|
|
public Mat img = null;
|
|
public Boolean alreadyUsed = false;
|
|
public Boolean imgToBeResized = false;
|
|
public Boolean windowToBeResized = false;
|
|
public Boolean positionToBeChanged = false;
|
|
public JFrame frame = null;
|
|
public JLabel lbl = null;
|
|
public int flag;
|
|
public int x = -1;
|
|
public int y = -1;
|
|
public int width = -1;
|
|
public int height = -1;
|
|
|
|
public ImageWindow(String name, Mat img) {
|
|
this.name = name;
|
|
this.img = img;
|
|
this.flag = WINDOW_NORMAL;
|
|
}
|
|
|
|
public ImageWindow(String name, int flag) {
|
|
this.name = name;
|
|
this.flag = flag;
|
|
}
|
|
|
|
public static Size keepAspectRatioSize(int original_width, int original_height, int bound_width, int bound_height) {
|
|
|
|
int new_width = original_width;
|
|
int new_height = original_height;
|
|
|
|
if (original_width > bound_width) {
|
|
new_width = bound_width;
|
|
new_height = (new_width * original_height) / original_width;
|
|
}
|
|
|
|
if (new_height > bound_height) {
|
|
new_height = bound_height;
|
|
new_width = (new_height * original_width) / original_height;
|
|
}
|
|
|
|
return new Size(new_width, new_height);
|
|
}
|
|
|
|
public void setMat(Mat img) {
|
|
|
|
this.img = img;
|
|
this.alreadyUsed = false;
|
|
|
|
if (imgToBeResized) {
|
|
resizeImage();
|
|
imgToBeResized = false;
|
|
}
|
|
|
|
}
|
|
|
|
public void setFrameLabelVisible(JFrame frame, JLabel lbl) {
|
|
this.frame = frame;
|
|
this.lbl = lbl;
|
|
|
|
if (windowToBeResized) {
|
|
lbl.setPreferredSize(new Dimension(width, height));
|
|
windowToBeResized = false;
|
|
}
|
|
|
|
if (positionToBeChanged) {
|
|
frame.setLocation(x, y);
|
|
positionToBeChanged = false;
|
|
}
|
|
|
|
frame.add(lbl);
|
|
frame.pack();
|
|
frame.setVisible(true);
|
|
}
|
|
|
|
public void setNewDimension(int width, int height) {
|
|
|
|
if (this.width != width || this.height != height) {
|
|
this.width = width;
|
|
this.height = height;
|
|
|
|
if (img != null) {
|
|
resizeImage();
|
|
} else {
|
|
imgToBeResized = true;
|
|
}
|
|
|
|
if (lbl != null) {
|
|
lbl.setPreferredSize(new Dimension(width, height));
|
|
} else {
|
|
windowToBeResized = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setNewPosition(int x, int y) {
|
|
if (this.x != x || this.y != y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
|
|
if (frame != null) {
|
|
frame.setLocation(x, y);
|
|
} else {
|
|
positionToBeChanged = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void resizeImage() {
|
|
if (flag == WINDOW_NORMAL) {
|
|
Size tmpSize = keepAspectRatioSize(img.width(), img.height(), width, height);
|
|
Imgproc.resize(img, img, tmpSize, 0, 0, Imgproc.INTER_LINEAR_EXACT);
|
|
}
|
|
}
|
|
}
|