📄 imageanalyzer.java
字号:
*/ 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); Object[] args = {new Integer(x), new Integer(y), new Integer(pixel), Integer.toHexString(pixel), rgb}; if (pixel == imageData.transparentPixel) { statusLabel.setText(createMsg(bundle.getString("Color_at_trans"), args)); } else { 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); } }); } // Post animation widget reset. postAnimation(); } }; animateThread.setDaemon(true); animateThread.start(); } } /* * Loop through all of the images in a multi-image file * and display them one after another. */ void animateLoop() { // Create an off-screen image to draw on, and a GC to draw with. // Both are disposed after the animation. Image offScreenImage = new Image(display, loader.logicalScreenWidth, loader.logicalScreenHeight); GC offScreenImageGC = new GC(offScreenImage); try { // Use syncExec to get the background color of the imageCanvas. display.syncExec(new Runnable() { public void run() { canvasBackground = imageCanvas.getBackground(); } }); // Fill the off-screen image with the background color of the canvas. offScreenImageGC.setBackground(canvasBackground); offScreenImageGC.fillRectangle( 0, 0, loader.logicalScreenWidth, loader.logicalScreenHeight); // Draw the current image onto the off-screen image. offScreenImageGC.drawImage( image, 0, 0, imageData.width, imageData.height, imageData.x, imageData.y, imageData.width, imageData.height); int repeatCount = loader.repeatCount; while (animate && (loader.repeatCount == 0 || repeatCount > 0)) { if (imageData.disposalMethod == SWT.DM_FILL_BACKGROUND) { // Fill with the background color before drawing. Color bgColor = null; int backgroundPixel = loader.backgroundPixel; if (showBackground && backgroundPixel != -1) { // Fill with the background color. RGB backgroundRGB = imageData.palette.getRGB(backgroundPixel); bgColor = new Color(null, backgroundRGB); } try { offScreenImageGC.setBackground(bgColor != null ? bgColor : canvasBackground); offScreenImageGC.fillRectangle( imageData.x, imageData.y, imageData.width, imageData.height); } finally { if (bgColor != null) bgColor.dispose(); } } else if (imageData.disposalMethod == SWT.DM_FILL_PREVIOUS) { // Restore the previous image before drawing. offScreenImageGC.drawImage( image, 0, 0, imageData.width, imageData.height, imageData.x, imageData.y, imageData.width, imageData.height); } // Get the next image data. imageDataIndex = (imageDataIndex + 1) % imageDataArray.length; imageData = imageDataArray[imageDataIndex]; image.dispose(); image = new Image(display, imageData); // Draw the new image data. offScreenImageGC.drawImage( image, 0, 0, imageData.width, imageData.height, imageData.x, imageData.y, imageData.width, imageData.height); // Draw the off-screen image to the screen. imageCanvasGC.drawImage(offScreenImage, 0, 0); // Sleep for the specified delay time before drawing again. try { Thread.sleep(visibleDelay(imageData.delayTime * 10)); } catch (InterruptedException e) { } // If we have just drawn the last image in the set, // then decrement the repeat count. if (imageDataIndex == imageDataArray.length - 1) repeatCount--; } } finally { offScreenImage.dispose(); offScreenImageGC.dispose(); } } /* * Pre animation setup. */ void preAnimation() { display.syncExec(new Runnable() { public void run() { // Change the label of the Animate button to 'Stop'. animateButton.setText(bundle.getString("Stop")); // Disable anything we don't want the user // to select during the animation. previousButton.setEnabled(false); nextButton.setEnabled(false); backgroundCombo.setEnabled(false); scaleXCombo.setEnabled(false); scaleYCombo.setEnabled(false); alphaCombo.setEnabled(false); incrementalCheck.setEnabled(false); transparentCheck.setEnabled(false); maskCheck.setEnabled(false); // leave backgroundCheck enabled // Reset the scale combos and scrollbars. resetScaleCombos(); resetScrollBars(); } }); } /* * Post animation reset. */ void postAnimation() { display.syncExec(new Runnable() { public void run() { // Enable anything we disabled before the animation. previousButton.setEnabled(true); nextButton.setEnabled(true); backgroundCombo.setEnabled(true); scaleXCombo.setEnabled(true); scaleYCombo.setEnabled(true); alphaCombo.setEnabled(true); incrementalCheck.setEnabled(true); transparentCheck.setEnabled(true); maskCheck.setEnabled(true); // Reset the label of the Animate button. animateButton.setText(bundle.getString("Animate")); if (animate) { // If animate is still true, we finished the // full number of repeats. Leave the image as-is. animate = false; } else { // Redisplay the current image and its palette. displayImage(imageDataArray[imageDataIndex]); } } }); } /* * Called when the Previous button is pressed. * Display the previous image in a multi-image file. */ void previous() { if (image != null && imageDataArray.length > 1) { if (imageDataIndex == 0) { imageDataIndex = imageDataArray.length; } imageDataIndex = imageDataIndex - 1; displayImage(imageDataArray[imageDataIndex]); } } /* * Called when the Next button is pressed. * Display the next image in a multi-image file. */ void next() { if (image != null && imageDataArray.length > 1) { imageDataIndex = (imageDataIndex + 1) % imageDataArray.length; displayImage(imageDataArray[imageDataIndex]); } } void displayImage(ImageData newImageData) { if (incremental && incrementalThread != null) { // Tell the incremental thread to stop drawing. synchronized (this) { incrementalEvents = null; } // Wait until the incremental thread is done. while (incrementalThread.isAlive()) { if (!display.readAndDispatch()) display.sleep(); } } // Dispose of the old image, if there was one. if (image != null) image.dispose(); try { // Cache the new image and imageData. image = new Image(display, newImageData); imageData = newImageData; } catch (SWTException e) { showErrorDialog(bundle.getString("Creating_from") + " ", currentName, e); image = null; return; } // Update the widgets with the new image info. String string = createMsg(bundle.getString("Analyzer_on"), currentName); shell.setText(string); if (imageDataArray.length > 1) { string = createMsg(bundle.getString("Type_index"), new Object[] {fileTypeString(imageData.type), new Integer(imageDataIndex + 1), new Integer(imageDataArray.length)}); } else { string = createMsg(bundle.getString("Type_string"), fileTypeString(imageData.type)); } typeLabel.setText(string);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -