📄 imageanalyzer.java
字号:
if (filetype == SWT.IMAGE_UNDEFINED) {
MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
box.setMessage(createMsg(bundle.getString("Unknown_extension"), filename.substring(filename.lastIndexOf('.') + 1)));
box.open();
return;
}
if (new java.io.File(filename).exists()) {
MessageBox box = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
box.setMessage(createMsg(bundle.getString("Overwrite"), filename));
if (box.open() == SWT.CANCEL)
return;
}
Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
imageCanvas.setCursor(waitCursor);
try {
// Save the current image to the specified file.
boolean multi = false;
if (loader.data.length > 1) {
MessageBox box = new MessageBox(shell, SWT.ICON_QUESTION | SWT.YES | SWT.NO | SWT.CANCEL);
box.setMessage(createMsg(bundle.getString("Save_all"), new Integer(loader.data.length)));
int result = box.open();
if (result == SWT.CANCEL)
return;
if (result == SWT.YES)
multi = true;
}
/*
* If the image has transparency but the user has transparency
* turned off, turn it off in the saved image.
*/
int transparentPixel = imageData.transparentPixel;
if (!multi && transparentPixel != -1 && !transparent) {
imageData.transparentPixel = -1;
}
if (!multi)
loader.data = new ImageData[] { imageData };
loader.save(filename, filetype);
/* Restore the previous transparency setting. */
if (!multi && transparentPixel != -1 && !transparent) {
imageData.transparentPixel = transparentPixel;
}
// Update the shell title and file type label,
// and use the new file.
fileName = filename;
shell.setText(createMsg(bundle.getString("Analyzer_on"), filename));
typeLabel.setText(createMsg(bundle.getString("Type_string"), fileTypeString(filetype)));
} catch (SWTException e) {
showErrorDialog(bundle.getString("Saving_lc"), filename, e);
} catch (SWTError e) {
showErrorDialog(bundle.getString("Saving_lc"), filename, e);
} finally {
shell.setCursor(null);
imageCanvas.setCursor(crossCursor);
waitCursor.dispose();
}
}
void menuSaveMaskAs() {
if (image == null || !showMask)
return;
if (imageData.getTransparencyType() == SWT.TRANSPARENCY_NONE)
return;
animate = false; // stop any animation in progress
// Get the user to choose a file name and type to save.
FileDialog fileChooser = new FileDialog(shell, SWT.SAVE);
fileChooser.setFilterPath(lastPath);
if (fileName != null)
fileChooser.setFileName(fileName);
fileChooser.setFilterExtensions(SAVE_FILTER_EXTENSIONS);
fileChooser.setFilterNames(SAVE_FILTER_NAMES);
String filename = fileChooser.open();
lastPath = fileChooser.getFilterPath();
if (filename == null)
return;
// Figure out what file type the user wants saved.
// We need to rely on the file extension because FileDialog
// does not have API for asking what filter type was selected.
int filetype = determineFileType(filename);
if (filetype == SWT.IMAGE_UNDEFINED) {
MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
box.setMessage(createMsg(bundle.getString("Unknown_extension"), filename.substring(filename.lastIndexOf('.') + 1)));
box.open();
return;
}
if (new java.io.File(filename).exists()) {
MessageBox box = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
box.setMessage(createMsg(bundle.getString("Overwrite"), filename));
if (box.open() == SWT.CANCEL)
return;
}
Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
imageCanvas.setCursor(waitCursor);
try {
// Save the mask of the current image to the specified file.
ImageData maskImageData = imageData.getTransparencyMask();
loader.data = new ImageData[] { maskImageData };
loader.save(filename, filetype);
} catch (SWTException e) {
showErrorDialog(bundle.getString("Saving_lc"), filename, e);
} catch (SWTError e) {
showErrorDialog(bundle.getString("Saving_lc"), filename, e);
} finally {
shell.setCursor(null);
imageCanvas.setCursor(crossCursor);
waitCursor.dispose();
}
}
void menuPrint() {
if (image == null)
return;
try {
// Ask the user to specify the printer.
PrintDialog dialog = new PrintDialog(shell, SWT.NONE);
PrinterData printerData = dialog.open();
if (printerData == null)
return;
Printer printer = new Printer(printerData);
Point screenDPI = display.getDPI();
Point printerDPI = printer.getDPI();
int scaleFactor = printerDPI.x / screenDPI.x;
Rectangle trim = printer.computeTrim(0, 0, 0, 0);
if (printer.startJob(currentName)) {
if (printer.startPage()) {
GC gc = new GC(printer);
int transparentPixel = imageData.transparentPixel;
if (transparentPixel != -1 && !transparent) {
imageData.transparentPixel = -1;
}
Image printerImage = new Image(printer, imageData);
gc.drawImage(printerImage, 0, 0, imageData.width, imageData.height, -trim.x, -trim.y, scaleFactor * imageData.width, scaleFactor * imageData.height);
if (transparentPixel != -1 && !transparent) {
imageData.transparentPixel = transparentPixel;
}
printerImage.dispose();
gc.dispose();
printer.endPage();
}
printer.endJob();
}
printer.dispose();
} catch (SWTError e) {
MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
box.setMessage(bundle.getString("Printing_error") + e.getMessage());
box.open();
}
}
void menuReopen() {
if (currentName == null)
return;
animate = false; // stop any animation in progress
Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
imageCanvas.setCursor(waitCursor);
try {
loader = new ImageLoader();
ImageData[] newImageData;
if (fileName == null) {
URL url = new URL(currentName);
InputStream stream = url.openStream();
long startTime = System.currentTimeMillis();
newImageData = loader.load(stream);
loadTime = System.currentTimeMillis() - startTime;
stream.close();
} else {
long startTime = System.currentTimeMillis();
newImageData = loader.load(fileName);
loadTime = System.currentTimeMillis() - startTime;
}
imageDataIndex = 0;
displayImage(newImageData[imageDataIndex]);
} catch (Exception e) {
showErrorDialog(bundle.getString("Reloading_lc"), currentName, e);
} catch (OutOfMemoryError e) {
showErrorDialog(bundle.getString("Reloading_lc"), currentName, e);
} finally {
shell.setCursor(null);
imageCanvas.setCursor(crossCursor);
waitCursor.dispose();
}
}
void changeBackground() {
String background = backgroundCombo.getText();
if (background.equals(bundle.getString("White"))) {
imageCanvas.setBackground(whiteColor);
} else if (background.equals(bundle.getString("Black"))) {
imageCanvas.setBackground(blackColor);
} else if (background.equals(bundle.getString("Red"))) {
imageCanvas.setBackground(redColor);
} else if (background.equals(bundle.getString("Green"))) {
imageCanvas.setBackground(greenColor);
} else if (background.equals(bundle.getString("Blue"))) {
imageCanvas.setBackground(blueColor);
} else {
imageCanvas.setBackground(null);
}
}
/*
* Called when the ScaleX combo selection changes.
*/
void scaleX() {
try {
xscale = Float.parseFloat(scaleXCombo.getText());
} catch (NumberFormatException e) {
xscale = 1;
scaleXCombo.select(scaleXCombo.indexOf("1"));
}
if (image != null) {
resizeScrollBars();
imageCanvas.redraw();
}
}
/*
* Called when the ScaleY combo selection changes.
*/
void scaleY() {
try {
yscale = Float.parseFloat(scaleYCombo.getText());
} catch (NumberFormatException e) {
yscale = 1;
scaleYCombo.select(scaleYCombo.indexOf("1"));
}
if (image != null) {
resizeScrollBars();
imageCanvas.redraw();
}
}
/*
* Called when the Alpha combo selection changes.
*/
void alpha() {
try {
alpha = Integer.parseInt(alphaCombo.getText());
} catch (NumberFormatException e) {
alphaCombo.select(alphaCombo.indexOf("255"));
alpha = 255;
}
}
/*
* Called when the mouse moves in the image canvas. Show the color of the
* image at the point under the mouse.
*/
void showColorAt(int mx, int my) {
int x = mx - imageData.x - ix;
int y = my - imageData.y - iy;
showColorForPixel(x, y);
}
/*
* Called when a mouse down or key press is detected in the data text. Show
* the color of the pixel at the caret position in the data text.
*/
void showColorForData() {
int delimiterLength = dataText.getLineDelimiter().length();
int charactersPerLine = 6 + 3 * imageData.bytesPerLine + delimiterLength;
int position = dataText.getCaretOffset();
int y = position / charactersPerLine;
if ((position - y * charactersPerLine) < 6 || ((y + 1) * charactersPerLine - position) <= delimiterLength) {
statusLabel.setText("");
return;
}
int dataPosition = position - 6 * (y + 1) - delimiterLength * y;
int byteNumber = dataPosition / 3;
int where = dataPosition - byteNumber * 3;
int xByte = byteNumber % imageData.bytesPerLine;
int x = -1;
int depth = imageData.depth;
if (depth == 1) { // 8 pixels per byte (can only show 3 of 8)
if (where == 0)
x = xByte * 8;
if (where == 1)
x = xByte * 8 + 3;
if (where == 2)
x = xByte * 8 + 7;
}
if (depth == 2) { // 4 pixels per byte (can only show 3 of 4)
if (where == 0)
x = xByte * 4;
if (where == 1)
x = xByte * 4 + 1;
if (where == 2)
x = xByte * 4 + 3;
}
if (depth == 4) { // 2 pixels per byte
if (where == 0)
x = xByte * 2;
if (where == 1)
x = xByte * 2;
if (where == 2)
x = xByte * 2 + 1;
}
if (depth == 8) { // 1 byte per pixel
x = xByte;
}
if (depth == 16) { // 2 bytes per pixel
x = xByte / 2;
}
if (depth == 24) { // 3 bytes per pixel
x = xByte / 3;
}
if (depth == 32) { // 4 bytes per pixel
x = xByte / 4;
}
if (x != -1) {
showColorForPixel(x, y);
} else {
statusLabel.setText("");
}
}
/*
* Set the status label to show color information for the specified pixel in
* the image.
*/
void showColorForPixel(int x, int y) {
if (x >= 0 && x < imageData.width && y >= 0 && y < imageData.height) {
int pixel = imageData.getPixel(x, y);
RGB rgb = imageData.palette.getRGB(pixel);
boolean hasAlpha = false;
int alphaValue = 0;
if (imageData.alphaData != null && imageData.alphaData.length > 0) {
hasAlpha = true;
alphaValue = imageData.getAlpha(x, y);
}
String rgbMessageFormat = bundle.getString(hasAlpha ? "RGBA" : "RGB");
Object[] rgbArgs = { Integer.toString(rgb.red), Integer.toString(rgb.green), Integer.toString(rgb.blue), Integer.toString(alphaValue) };
Object[] rgbHexArgs = { Integer.toHexString(rgb.red), Integer.toHexString(rgb.green), Integer.toHexString(rgb.blue), Integer.toHexString(alphaValue) };
Object[] args = { new Integer(x), new Integer(y), new Integer(pixel), Integer.toHexString(pixel), createMsg(rgbMessageFormat, rgbArgs),
createMsg(rgbMessageFormat, rgbHexArgs), (pixel == imageData.transparentPixel) ? bundle.getString("Color_at_transparent") : "" };
statusLabel.setText(createMsg(bundle.getString("Color_at"), args));
} else {
statusLabel.setText("");
}
}
/*
* Called when the Animate button is pressed.
*/
void animate() {
animate = !animate;
if (animate && image != null && imageDataArray.length > 1) {
animateThread = new Thread(bundle.getString("Animation")) {
public void run() {
// Pre-animation widget setup.
preAnimation();
// Animate.
try {
animateLoop();
} catch (final SWTException e) {
display.syncExec(new Runnable() {
public void run() {
showErrorDialog(createMsg(bundle.getString("Creating_image"), new Integer(imageDataIndex + 1)), currentName, e);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -