📄 imageanalyzer.java
字号:
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); } catch (SWTError 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); } catch (SWTError 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) { String name = fileName; int nameStart = name.lastIndexOf(java.io.File.separatorChar); if (nameStart > -1) { name = name.substring(nameStart + 1); } fileChooser.setFileName(name); } 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); } 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(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); } 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.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"))) { 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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -