图片放大、缩小、恢复操作的实现

本文介绍了一种基于SWT的图片缩放功能实现方法,通过计算图片显示比例完成图片放大、缩小及恢复原始大小的操作。代码示例展示了如何使用自定义类ZoomInOut调整图片显示比例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无论怎样实现图片的显示操作,基本上都是将图片显示在类似于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(int i)方法来获取图片的显示比例。

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 ====================================

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值