📄 imageanalyzer.java
字号:
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);
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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -