⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageanalyzer.java

📁 SWT开发例子
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	 */	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 + -