📄 imageanalyzer.java
字号:
resetScaleCombos();
// Get the user to choose an image file.
FileDialog fileChooser = new FileDialog(shell, SWT.OPEN);
if (lastPath != null)
fileChooser.setFilterPath(lastPath);
fileChooser.setFilterExtensions(new String[] { "*.bmp; *.gif; *.ico; *.jpg; *.pcx; *.png; *.tif", "*.bmp", "*.gif", "*.ico", "*.jpg", "*.pcx", "*.png", "*.tif" });
fileChooser.setFilterNames(new String[] { bundle.getString("All_images") + " (bmp, gif, ico, jpg, pcx, png, tif)",
"BMP (*.bmp)", "GIF (*.gif)", "ICO (*.ico)", "JPEG (*.jpg)", "PCX (*.pcx)", "PNG (*.png)", "TIFF (*.tif)" });
String filename = fileChooser.open();
lastPath = fileChooser.getFilterPath();
if (filename == null)
return;
Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
imageCanvas.setCursor(waitCursor);
try {
loader = new ImageLoader();
if (incremental) {
// Prepare to handle incremental events.
loader.addImageLoaderListener(new ImageLoaderListener() {
public void imageDataLoaded(ImageLoaderEvent event) {
incrementalDataLoaded(event);
}
});
incrementalThreadStart();
}
// Read the new image(s) from the chosen file.
long startTime = System.currentTimeMillis();
imageDataArray = loader.load(filename);
loadTime = System.currentTimeMillis() - startTime;
if (imageDataArray.length > 0) {
// Cache the filename.
currentName = filename;
fileName = filename;
// If there are multiple images in the file (typically GIF)
// then enable the Previous, Next and Animate buttons.
previousButton.setEnabled(imageDataArray.length > 1);
nextButton.setEnabled(imageDataArray.length > 1);
animateButton.setEnabled(imageDataArray.length > 1 && loader.logicalScreenWidth > 0 && loader.logicalScreenHeight > 0);
// Display the first image in the file.
imageDataIndex = 0;
displayImage(imageDataArray[imageDataIndex]);
resetScrollBars();
}
} catch (SWTException e) {
showErrorDialog(bundle.getString("Loading_lc"), filename, e);
} finally {
shell.setCursor(null);
imageCanvas.setCursor(crossCursor);
waitCursor.dispose();
}
}
void menuOpenURL() {
animate = false; // stop any animation in progress
resetScaleCombos();
// Get the user to choose an image URL.
TextPrompter textPrompter = new TextPrompter(shell, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
textPrompter.setText(bundle.getString("OpenURLDialog"));
textPrompter.setMessage(bundle.getString("EnterURL"));
String urlname = textPrompter.open();
if (urlname == null) return;
Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
imageCanvas.setCursor(waitCursor);
try {
URL url = new URL(urlname);
InputStream stream = url.openStream();
loader = new ImageLoader();
if (incremental) {
// Prepare to handle incremental events.
loader.addImageLoaderListener(new ImageLoaderListener() {
public void imageDataLoaded(ImageLoaderEvent event) {
incrementalDataLoaded(event);
}
});
incrementalThreadStart();
}
// Read the new image(s) from the chosen file.
long startTime = System.currentTimeMillis();
imageDataArray = loader.load(stream);
loadTime = System.currentTimeMillis() - startTime;
if (imageDataArray.length > 0) {
currentName = urlname;
fileName = null;
// If there are multiple images in the file (typically GIF)
// then enable the Previous, Next and Animate buttons.
previousButton.setEnabled(imageDataArray.length > 1);
nextButton.setEnabled(imageDataArray.length > 1);
animateButton.setEnabled(imageDataArray.length > 1 && loader.logicalScreenWidth > 0 && loader.logicalScreenHeight > 0);
// Display the first image in the file.
imageDataIndex = 0;
displayImage(imageDataArray[imageDataIndex]);
resetScrollBars();
}
} catch (Exception e) {
showErrorDialog(bundle.getString("Loading_lc"), urlname, e);
} finally {
shell.setCursor(null);
imageCanvas.setCursor(crossCursor);
waitCursor.dispose();
}
}
/*
* Called to start a thread that draws incremental images
* as they are loaded.
*/
void incrementalThreadStart() {
incrementalEvents = new Vector();
incrementalThread = new Thread("Incremental") {
public void run() {
// Draw the first ImageData increment.
while (incrementalEvents != null) {
// Synchronize so we don't try to remove when the vector is null.
synchronized (ImageAnalyzer.this) {
if (incrementalEvents != null) {
if (incrementalEvents.size() > 0) {
ImageLoaderEvent event = (ImageLoaderEvent) incrementalEvents.remove(0);
if (image != null) image.dispose();
image = new Image(display, event.imageData);
imageData = event.imageData;
imageCanvasGC.drawImage(
image,
0,
0,
imageData.width,
imageData.height,
imageData.x,
imageData.y,
imageData.width,
imageData.height);
} else {
yield();
}
}
}
}
display.wake();
}
};
incrementalThread.setDaemon(true);
incrementalThread.start();
}
/*
* Called when incremental image data has been loaded,
* for example, for interlaced GIF/PNG or progressive JPEG.
*/
void incrementalDataLoaded(ImageLoaderEvent event) {
// Synchronize so that we do not try to add while
// the incremental drawing thread is removing.
synchronized (this) {
incrementalEvents.addElement(event);
}
}
void menuSave() {
if (image == null) return;
animate = false; // stop any animation in progress
// If the image file type is unknown, we can't 'Save',
// so we have to use 'Save As...'.
if (imageData.type == SWT.IMAGE_UNDEFINED || fileName == null) {
menuSaveAs();
return;
}
Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
imageCanvas.setCursor(waitCursor);
try {
// Save the current image to the current file.
loader.data = new ImageData[] {imageData};
loader.save(fileName, imageData.type);
} catch (SWTException e) {
showErrorDialog(bundle.getString("Saving_lc"), fileName, e);
} finally {
shell.setCursor(null);
imageCanvas.setCursor(crossCursor);
waitCursor.dispose();
}
}
void menuSaveAs() {
if (image == null) 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(new String[] { "*.bmp", "*.gif", "*.ico", "*.jpg", "*.png" });
fileChooser.setFilterNames(new String[] { "BMP (*.bmp)", "GIF (*.gif)", "ICO (*.ico)", "JPEG (*.jpg)", "PNG (*.png)" });
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 current image to the specified file.
loader.data = new ImageData[] {imageData};
loader.save(filename, filetype);
// 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);
} 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(new String[] { "*.bmp", "*.gif", "*.ico", "*.jpg", "*.png" });
fileChooser.setFilterNames(new String[] { "BMP (*.bmp)", "GIF (*.gif)", "ICO (*.ico)", "JPEG (*.jpg)", "PNG (*.png)" });
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);
} 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.NULL);
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
resetScrollBars();
resetScaleCombos();
Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
shell.setCursor(waitCursor);
imageCanvas.setCursor(waitCursor);
try {
loader = new ImageLoader();
long startTime = System.currentTimeMillis();
ImageData[] newImageData;
if (fileName == null) {
URL url = new URL(currentName);
InputStream stream = url.openStream();
newImageData = loader.load(stream);
} else {
newImageData = loader.load(fileName);
}
loadTime = System.currentTimeMillis() - startTime;
imageDataIndex = 0;
displayImage(newImageData[imageDataIndex]);
} catch (Exception 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"))) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -