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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

无论怎样实现图片的显示操作,基本上都是将图片显示在类似于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 ====================================

C#(winform)实现图片的无损放大缩小【点击鼠标滚动键放大缩小 usingSystem;//来源于www.uzhanbao.com usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Drawing; usingSystem.D... 阅读详情

相关推荐

Magnification API-Windows放大

Windows Vista系统之后引入了Magnification API函数,链库为Magnification.dll用于桌面放大,Win7系统只有以下函数: 1、MagInitialize:装载Magnification功能 2、MagUninitialize:卸载Magnification 功能 3、MagGetColorEffect:获取颜色配置 4、MagSetImageScalingCallback:获得捕获桌面图像数据回调函数 5、MagGetWindowFilterList:获取要(或者排除

cyradg2008的博客 2929

点击放大图片,滑动可放大缩小

点击图片放大,滚动鼠标图片放大缩小,适应pc和移动端

点击图片放大缩小的效果

放大效果

SWT中显示图片并调整大小

如何在SWT中显示图片并调整大小呢?在swt中要显示的图片是不能改变大小的,比如我们用backgroundimage。但是有时我需要把我们想要显示的图片按一定比例自动的适应我们要显示的区域,这是我们要用画图的方法来实现。 每一个控件都有一个paintContral的事件,我们可以

abrahu的专栏 1万+

自定义ImageView(实现图片放大缩小;放大后可平移)

忘记从哪看到了 分享一下

guanguangg的博客 1837

ExtJs 完美实现图片在Window窗口中通过鼠标滚轮放大缩小以及点击拖拽

ExtJs 完美实现图片在Window窗口中通过鼠标滚轮放大缩小以及点击拖拽以下内容需要一定的ExtJs以及Js知识基础 ExtJs 完美实现图片在Window中通过鼠标滚轮放大缩小以及点击拖拽以下内容需要一定的ExtJs以及Js知识作为基础,不过我会尽量详细解释。Ext.define('window.ViewPicWin',{//定义一个类继承window 所有配置都在该类里 包括图片地址等

lany1988的博客 4629

安卓手势处理(三)之实现图片放大缩小

这一篇来实现下面的效果: 其实上面的效果可以用ScaleGestureDetector很容易实现,不过在这里我想自己动手实现一下这个简单的功能,然后在后面用GestureDetector来实现更全面的效果,并且封装成一个可支持手势放大缩小Imageview。 ImageView的缩小放大是基于Matrix的,这个类其实是一个矩阵,放大缩小、位移、旋转其实就是矩阵变换操作。具体可以看这篇文章:...

whoami_I的博客 1345

iOS开发 UI高级 图片放大缩小实现

#import @interface ChangeScaleView : UIImageView @property(nonatomic,strong)UIScrollView *scrollView; @property(nonatomic,strong)UIImageView *scaleImageView; @end#import "ChangeScaleView.h" @implem

A_Studystudy的博客 1060

javascript实现图片的随意拖拽,放大缩小

最近写项目的过程中需要对图片进行一个操作,点击之后弹出图片,在可定div范围内对图片进行任意拖拽位置和鼠标滚动时对其放大缩小,双击图片恢复原图!对于我们这样后台程序员而言,这种前台效果实现起来确实有点勉强,在经过半个小时挣扎之后,终于完成效果,发表上来,以供广大后台程序员借鉴吧! 第一步: body之内的代...

weixin_34403693的博客 1113

图片放大缩小恢复原比例、旋转vue

支持图片放大缩小恢复原比例、旋转

m0_68428581的博客 304

利用按键,简单的进行缩放图片

#include<iostream> #include<opencv2/opencv.hpp> #define window1 "【结果1】" #define window "【原图 】" #define window2 "【结果2】" #define window3 "【结果3】" #define window4 "【结果4】" #define window5 "【结...

gaocui883的博客 570

图片点击放大功能的实现

图片点击放大功能的实现 实现过程及思路 1、引入图片 2、向图片添加类 3、做循环判断,单次放大,双次缩小 参考代码下载地址 $(function () { var num = 0; $('#first').click(function () { num+=1; if(num == 1){ ...

weixin_39133064的博客 371

简单的flash图片浏览效果

  [要求] 按下鼠标拖动图片缓冲放大并移到最前面,松开鼠标停止拖动图片缓冲缩小。 [步骤] 导入几张图片分别转为影片元件,拖到主场景,实例名分别为pic0_mc、pic1_mc、pic2_mc……在帧上写如下代码: for (var d:Number = 0; d=200) {     delete this.onEnterFrame;    }   }; }; ...

hgfghw8 148

Vue 修改行内样式 + prefixStyle 样式兼容处理

Vue 修改行内样式 + prefixStyle 样式兼容处理

木木的学习笔记 1089

js实现图片放大缩小效果

代码结构: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> //在标签上添加onmouseover(鼠标移

qq_44718582的博客 4250

利用javascript实现图片动态的放大缩小

利用javascript实现图片动态的放大缩小 在网站经常用到缩略图,但一般情况下是不能改变大小的.文本实现了这么⼀个效果, 当你鼠标移到 缩略图上时, 缩略图动态的放大到设定的大小,鼠标移开时,动态的恢复到缩略图的大小.主要是通 过javascript实现.适当的应用可以增强用户体验. 文章原始链接:http://www.codeproject.com/useritems/Ex

Li_soso的专栏 1422
上一篇: Oracle数据库定时备份导出
下一篇: SWT应用之:随机RGB颜色、ScrolledComposite控件的使用(二)————SWT Component(SWT组件)使用
CaptainGan
博客等级 码龄18年 23粉丝 12原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值