`

ScaleImageDemo图像缩小与放大演示

阅读更多
package Assis;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.*;
import java.io.*;

// 图像缩小与放大演示

public class ScaleImageDemo extends JFrame {
	private static final long serialVersionUID = 1L;
	private JPanel panel = new JPanel(); // 面板panel用于容纳图像放大、缩小、还原按钮
	private JButton jbFile = new JButton("打开图像文件"); // 打开图像文件按钮
	private JButton jbZoomIn = new JButton("放大"); // 图像放大按钮
	private JButton jbZoomOut = new JButton("缩小"); // 图像缩小按钮
	private JButton jbReset = new JButton("还原"); // 图像还原按钮
	ScalePane showImagePane = new ScalePane(); // 创建showImagePane对象用于绘制图像
	Container content = getContentPane(); // 获得窗口的容器

	// 构造函数
	public ScaleImageDemo() {
		super("图像的缩小与放大"); // 调用父类构造器设置窗口标题栏
		// 为按钮添加动作监听器
		//jbFile.addActionListener(new ButtonActionListener());
		jbZoomIn.addActionListener(new ButtonActionListener());
		jbZoomOut.addActionListener(new ButtonActionListener());
		jbReset.addActionListener(new ButtonActionListener());
		jbFile.addActionListener(new ButtonActionListener());
		// 把图像放大按钮、图像缩小按钮、图像还原按钮加入panel面板
		panel.add(jbZoomIn);
		panel.add(jbZoomOut);
		panel.add(jbReset);
		panel.add(jbFile);
		// 把showImagePane文件选择组合框、控制面板、状态栏标签加入到窗口内容窗格
		content.add(showImagePane, BorderLayout.CENTER);
		//content.add(jbFile, BorderLayout.NORTH);
		content.add(panel, BorderLayout.SOUTH);
		setSize(500, 400); // 设置窗口大小
		setVisible(true); // 设置窗口可见
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
	}

	// 使用文件选择器载入图像
	public void fileSelect() {
		JFileChooser chooser = new JFileChooser(); // 实例化文件选择器
		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);// 模式为仅打开文件
		chooser.setCurrentDirectory(new File(".")); // 设置文件选择器当前目录
		// 设置图像文件过滤器
		chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
			public boolean accept(File file) { // 可接受的文件类型
				String name = file.getName().toLowerCase(); // 获取文件名
				return name.endsWith(".png") || name.endsWith(".gif") || name.endsWith(".jpg") || name.endsWith(".jpeg") || file.isDirectory();
			}

			public String getDescription() {
				return "图像文件"; // 文件描述
			}
		});
		int result = chooser.showOpenDialog(this); // 显示文件选择对话框
		if (result == JFileChooser.APPROVE_OPTION) { // 得到用户行为
			String fileName = chooser.getSelectedFile().getAbsolutePath(); // 得到选择的文件名
			showImagePane.loadImage(fileName); // 截入图像并显示
			//showImagePane.loadImage("d:/pic.png"); // 截入图像并显示
		}
	}

	public static void main(String[] args) {
		new ScaleImageDemo();
	}

	// 按钮事件处理类
	class ButtonActionListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JButton button = (JButton) e.getSource();
			//   if (button == jbFile) {
			//    fileSelect();
			//   } else
			if (button == jbZoomIn) {
				showImagePane.scaleX *= 1.25; // 图像x轴方向放大因子
				showImagePane.scaleY *= 1.25; // 图像y轴方向放大因子
				System.out.println(showImagePane.scaleX+","+showImagePane.scaleY);
				showImagePane.applyFilter(); // 过滤图像
				showImagePane.repaint(); // 重绘showImagePane面板
				jbReset.setEnabled(true);
			} else if (button == jbZoomOut) {
				showImagePane.scaleX *= 0.8; // 图像x轴方向缩小因子
				showImagePane.scaleY *= 0.8; // 图像y轴方向缩小因子
				showImagePane.applyFilter(); // 过滤图像
				showImagePane.repaint(); // 重绘showImagePane面板
				jbReset.setEnabled(true);
			} else if (button == jbReset) {
				showImagePane.scaleX = 1.0; // 图像x轴方向放大因子还原为1.0
				showImagePane.scaleY = 1.0; // 图像y轴方向放大因子还原为1.0
				showImagePane.applyFilter(); // 过滤图像
				showImagePane.repaint(); // 重绘showImagePane面板
				jbReset.setEnabled(false);
			} else if (button == jbFile) {
				fileSelect();
			}
		}
	}

	// 显示图像的面板
	class ScalePane extends JPanel {
		private static final long serialVersionUID = 1L;
		Image image;
		BufferedImage bufImage; // 用于显示的缓冲区图像
		BufferedImage originalBufImage; // 原始缓冲区图像
		Graphics2D bufImageG; // 缓冲区图像的图形环境
		double scaleX = 1.0; // 图像水平方向的缩放因子
		double scaleY = 1.0; // 图像竖直方向的缩放因子

		// 截入图像
		public void loadImage(String fileName) {
			image = this.getToolkit().getImage(fileName); // 取得图像
			MediaTracker mt = new MediaTracker(this); // 实例化媒体加载器
			mt.addImage(image, 0); // 增加图像到加载器中
			try {
				mt.waitForAll(); // 等待图片加载
			} catch (Exception ex) {
				ex.printStackTrace(); // 输出出错信息
			}
			originalBufImage = new BufferedImage(image.getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_ARGB); // 创建原始缓冲区图像
			bufImage = originalBufImage;
			bufImageG = bufImage.createGraphics(); // 创建bufImage的图形环境
			bufImageG.drawImage(image, 0, 0, this); // 传输源图像数据到缓冲区图像中
			repaint(); // 重绘组件
		}

		// 过滤图像
		public void applyFilter() {
			if (bufImage == null)
				return; // 如果bufImage为空则直接返回
			BufferedImage filteredBufImage = new BufferedImage((int) (image.getWidth(this) * scaleX), (int) (image.getHeight(this) * scaleY),
					BufferedImage.TYPE_INT_ARGB); // 过滤后的图像
			AffineTransform transform = new AffineTransform(); // 仿射变换对象
			transform.setToScale(scaleX, scaleY); // 设置仿射变换的比例因子
			AffineTransformOp imageOp = new AffineTransformOp(transform, null);// 创建仿射变换操作对象
			imageOp.filter(originalBufImage, filteredBufImage);// 过滤图像,目标图像在filteredBufImage
			bufImage = filteredBufImage; // 让用于显示的缓冲区图像指向过滤后的图像
			repaint(); // 重绘组件
		}

		// 重载容器的paintComponent()方法
		public void paint(Graphics g) {
			super.paintComponent(g);
			if (bufImage != null) {
				Graphics2D g2 = (Graphics2D) g;
				g2.drawImage(bufImage, (this.getWidth() - bufImage.getWidth()) / 2, (this.getHeight() - bufImage.getHeight()) / 2, this); // 绘制图片
			}
		}
	}
}

 

分享到:
评论

相关推荐

    Java图片缩小与放大特效.rar

    Java图片缩小与放大特效,// 图像缩小与放大演示  public class ScaleImageDemo extends JFrame {  private JPanel panel = new JPanel(); //面板panel用于容纳图像放大、缩孝还原按钮  private JButton ...

    JAVA课程设计图片放大缩小器

    在实现图像放大缩小功能时,开发者可能会采用以下两种常见的方法: 1. **最近邻插值法**:这是一种简单快速的放大方法,但可能导致图像边缘锯齿状。它通过在原始像素周围寻找最近的颜色来填充新的像素位置。 2. **...

    java绘图 图片缩放 实例代码

    `ScaleImageDemo.java` 是一个Java应用程序,它展示了如何加载图片(例如 `2.jpg`),然后对其进行缩放。下面我们将深入解析这个过程。 1. **加载图片**: 首先,我们需要使用`javax.imageio.ImageIO`类的`read()`...

    Ubuntu 命令技巧手册.rar

    Ubuntu命令技巧手册》是专为Ubuntu用户设计的一份实用指南,它涵盖了广泛的操作系统管理、文件处理、网络通信及系统维护等方面的命令行操作技巧。Ubuntu是一个基于Debian的开源Linux发行版,以其用户友好性和强大的命令行工具而受到全球开发者和用户的喜爱。通过熟练掌握这些命令技巧,用户可以更高效地在Ubuntu环境中工作。 手册首先会介绍Ubuntu的基本概念,包括终端的使用和命令行的基本语法。在Linux系统中,终端是执行各种系统级任务的核心工具,用户可以通过键盘输入命令来执行操作,而无需图形化界面。掌握如何打开终端(如通过快捷键Ctrl+Alt+T)以及基本的命令行导航(如cd、ls、pwd)是使用Ubuntu的第一步。 文件和目录管理是Ubuntu命令行中的重要部分。例如,`mkdir`用于创建新目录,`touch`用于创建新文件,`cp`和`mv`分别用于复制和移动文件或目录,而`rm`则用于删除。了解这些命令的选项,如递归操作(-r)和强制删除(-f),能帮助用户更灵活地管理文件系统。

    stylus-chrome-mv3-2.3.5-8bf13db-id.zip

    Stylus是一款能改变网站样式的样式管理器(谷歌浏览器插件)

    springboot项目基于Spring与Vue的疫情居家检测管理系统的设计与实现代码.zip

    springboot项目基于Spring与Vue的疫情居家检测管理系统的设计与实现代码,含有完整的源码和报告文档

    文本框说明文字循环PPT模板.pptx

    文本框说明文字循环PPT模板

    四色旗并列关系PPT图形模板.pptx

    图表分类ppt

    《线性代数及其应用》Linear Algebra and Its Applications - 5th Edition - David C. Lay

    Linear Algebra and Its Applications - 5th Edition - David C. Lay《线性代数及其应用》 能复制。英文版本。

    MATLAB环境下一种自适应Chirp模态分解方法 算法运行环境为Matlab r2018a,可用于一维时间序列分解,时频分析,故障诊断,特征提取等 算法可迁移至金融时间序列,地震 微震信号,机械

    MATLAB环境下一种自适应Chirp模态分解方法。 算法运行环境为Matlab r2018a,可用于一维时间序列分解,时频分析,故障诊断,特征提取等。 算法可迁移至金融时间序列,地震 微震信号,机械振动信号,声发射信号,电压 电流信号,语音信号,声信号,生理信号(ECG,EEG,EMG)等一维时间序列信号。 压缩包=程序+数据+参考。

    信捷PLC程序 信捷XDM系列PLC程序,信捷触摸屏程序 双轴圆弧插补三轴画圆程序

    信捷PLC程序 信捷XDM系列PLC程序,信捷触摸屏程序 双轴圆弧插补三轴画圆程序

    3b053校园外卖配送_springboot+vue.zip

    项目资源包含:可运行源码+sql文件+文档 源码都是精心调试,有文档,可以部署,有费用,谢谢支持。 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 有任何使用上的问题,欢迎随时与博主沟通,博主看到后会第一时间及时解答。 开发语言:Java 框架:SpringBoot 技术:Vue JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 系统是一个很好的项目,结合了后端服务(SpringBoot)和前端用户界面(Vue.js)技术,实现了前后端分离。

    计算机相关专业毕业设计&大作业 (包含源码、说明)基于yolov5的旋转目标检测

    资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立

    基于单目视觉原理,研究目标图像的预处理、识别、定位方法与测距模型,设计实现一个目标识别与定位测距原型系统。_MonocularVisionRanging.zip

    基于单目视觉原理,研究目标图像的预处理、识别、定位方法与测距模型,设计实现一个目标识别与定位测距原型系统。_MonocularVisionRanging

    基于留出法、k折交叉验证和留一法的多种机器学习模型对比(用于分类)MATLAB程序:代码中共包含决策树(DT)、判别分析(DA)、集成树(ET)、高斯混合模型(GMM)、k近邻(KNN)、多分类支持向

    基于留出法、k折交叉验证和留一法的多种机器学习模型对比(用于分类)MATLAB程序:代码中共包含决策树(DT)、判别分析(DA)、集成树(ET)、高斯混合模型(GMM)、k近邻(KNN)、多分类支持向量机(MSVM)、支持向量机(SVM)、随机森林(RF)八种机器学习模型,可以任意选择,分别用留出法、k折交叉验证和留一法进行分类效果对比。 代码注释清楚。 main为主程序,读取EXCEL数据。 很方便,容易上手。 温馨提示:联系请考虑是否需要,程序代码,一经出,概不 。

    SPOTIFY - Culture Next Report_CAIG.pdf

    SPOTIFY - Culture Next Report_CAIG

    3b051在线视频点播系统_springboot+vue0.zip

    项目资源包含:可运行源码+sql文件+ 源码都是精心调试,,可以部署,有费用,谢谢支持。 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 有任何使用上的问题,欢迎随时与博主沟通,博主看到后会第一时间及时解答。 开发语言:Java 框架:SpringBoot 技术:Vue JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 系统是一个很好的项目,结合了后端服务(SpringBoot)和前端用户界面(Vue.js)技术,实现了前后端分离。

    springboot项目基于Web的课程设计选题管理系统.zip

    springboot项目基于Web的课程设计选题管理系统,含有完整的源码和报告文档

    ThinkPHP帮助文档chm版打包下载最新版本

    ThinkPHP是一个高性能且功能完备的轻量级PHP开发框架,具备众多原创特性,并秉持“大道至简”的开发理念,致力于以最少的代码实现更多功能,旨在简化并加速WEB应用的开发流程。自1.*版本起,该框架便不再兼容PHP4,从而使其架构与实现更为灵活与简洁。2.0版本在前序版本的基础上,经过全面重构与持续优化,达到了新的高度,满足企业级与门户级开发的标准。 以下是ThinkPHP相关文档的列表: - ThinkPHP 2.0 Q&A.chm - ThinkPHP-2.0-API.chm - ThinkPHP2.0完全开发手册.chm - ThinkPHP2.0开发技巧.chm - ThinkPHP2.1 RBAC使用和示例操作.chm - ThinkPHP2.1 完全开发手册.chm - ThinkPHP2.1 常见问题&开发技巧.chm - ThinkPHP2.1 自定义标签示例说明.chm

    无人机VESC7500,低压伺服keil源码,可以无感,霍尔单馈,正余弦,ABZ等多种反馈信号,是用非线性磁链观测器,高频注入等多种算法于一身,上位机源码,原理图 没有PCB 最大电流300A,是学

    无人机VESC7500,低压伺服keil源码,可以无感,霍尔单馈,正余弦,ABZ等多种反馈信号,是用非线性磁链观测器,高频注入等多种算法于一身,上位机源码,原理图。 没有PCB 最大电流300A,是学习不错的资料。

Global site tag (gtag.js) - Google Analytics