无论怎样实现图片的显示操作,基本上都是将图片显示在类似于Canvas控件中。图片的放大、缩小和恢复操作就是通过计算图片的显示大小比例来实现图片的放大缩小和恢复功能。
在下面提供图片的比例的计算类,其中包含图片放大和缩小的比率,很简单。
package com.tool;
public class ZoomInOut {
private static double rate = 1;
public static double onZoom(int zoom) {
double drate = 0;
if (zoom == 0) {
drate = showOriginal();
} else if (zoom > 0) {
drate = zoomOut();
} else if (zoom < 0) {
drate = zoomIn();
}
return drate;
}
private static double showOriginal() {
rate = 1;
return rate;
}
private static double zoomIn() {
// 销毁缩放图片,重新计算缩放图片
rate = rate - 0.1;
if (rate < 0.1) {
rate = 0.1;
}
return rate;
}
private static double zoomOut() {
// 销毁缩放图片,重新计算缩放图片
rate = rate + 0.1;
if (rate > 5) {
rate = 5;
}
return rate;
}
}
double rate = ZoomInOut.onZoom(0);表示恢复图片原始大小。
double rate = ZoomInOut.onZoom(1);表示图片进行放大操作。
double rate = ZoomInOut.onZoom(-1);表示图片进行缩小操作。
我使用SWT做了一个Demo来验证下:
代码如下:
package swt_jface.demo3;
import org.eclipse.swt.widgets.Display;
public class ImageZoomOut {
protected Shell shell;
private Canvas canvas ;
private Image image;
private double rate = 1;
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
try {
ImageZoomOut window = new ImageZoomOut();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Open the window.
*/
public void open() {
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
/**
* Create contents of the window.
*/
protected void createContents() {
shell = new Shell();
shell.setSize(678, 576);
shell.setText("SWT Application");
shell.setLayout(new FillLayout(SWT.HORIZONTAL));
{
Composite composite = new Composite(shell, SWT.NONE);
Composite composite_1 = new Composite(composite, SWT.BORDER);
composite_1.setLayout(new FillLayout(SWT.HORIZONTAL));
{
canvas = new Canvas(composite_1, SWT.NONE);
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
if (image != null) {
int width = (int)(image.getBounds().width * rate);
int heigth = (int)(image.getBounds().height * rate);
e.gc.drawImage(image, 0, 0, image.getBounds().width, image.getBounds().height, 0, 0, width, heigth);
}
}
});
}
Group group = new Group(composite, SWT.NONE);
{
Button button = new Button(group, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
String[] extentions = new String[]{".jpg", ".bmp", ".*"};
fileDialog.setFilterNames(extentions);
fileDialog.open();
if (fileDialog.getFilterPath() != null && !fileDialog.getFilterPath().equals("")) {
String imagepath = fileDialog.getFilterPath() + "\\" + fileDialog.getFileName();
image = new Image(Display.getDefault(), imagepath);
if (image != null) {
canvas.redraw();
}
}
}
});
button.setBounds(137, 40, 72, 22);
button.setText("选择图片");
}
{
Button button = new Button(group, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
zoomImageOperation(1);
}
});
button.setBounds(234, 40, 72, 22);
button.setText("放大");
}
{
Button button = new Button(group, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
zoomImageOperation(-1);
}
});
button.setBounds(337, 40, 72, 22);
button.setText("缩小");
}
{
Button button = new Button(group, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
zoomImageOperation(0);
}
});
button.setBounds(440, 40, 72, 22);
button.setText("恢复");
}
GroupLayout gl_composite = new GroupLayout(composite);
gl_composite.setHorizontalGroup(
gl_composite.createParallelGroup(GroupLayout.LEADING)
.add(composite_1, GroupLayout.DEFAULT_SIZE, 670, Short.MAX_VALUE)
.add(group, GroupLayout.DEFAULT_SIZE, 670, Short.MAX_VALUE)
);
gl_composite.setVerticalGroup(
gl_composite.createParallelGroup(GroupLayout.LEADING)
.add(gl_composite.createSequentialGroup()
.add(composite_1, GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE)
.addPreferredGap(LayoutStyle.RELATED)
.add(group, GroupLayout.PREFERRED_SIZE, 103, GroupLayout.PREFERRED_SIZE))
);
composite.setLayout(gl_composite);
}
}
private void zoomImageOperation(int i) {
rate = ZoomInOut.onZoom(i);
canvas.redraw();
}
}
实现成功的截图:
点击放大按钮:
实现成功。
=================================== OVER ====================================