`

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()`...

    carsim,simulink联合仿真,自动驾驶基于mpc自定义期望速度跟踪控制,可以在外部自定义期望速度传入sfunction函数,设置了两个不同状态方程,控制量为加速度,加速度变化量提供进行对比

    carsim,simulink联合仿真,自动驾驶基于mpc自定义期望速度跟踪控制,可以在外部自定义期望速度传入sfunction函数,设置了两个不同状态方程,控制量为加速度,加速度变化量提供进行对比,carsim2019

    matlab实现阿基米德算法AOA求解零空闲流水车间调度问题NIFSP-阿基米德算法-流水车间调度-NIFSP-matlab

    内容概要:本文介绍了一种基于阿基米德优化算法(AOA)的零空闲流水车间调度问题(NIFSP)的求解方法。阿基米德优化算法(AOA)模拟古希腊数学家阿基米德螺旋思想,通过模拟浮力和杠杆原理进行全局搜索和局部寻优。实验结果显示,AOA算法在NIFSP中有较好的表现,能有效降低加工时间和提高流水线效率。 适合人群:对智能制造和调度优化有兴趣的研究人员和工程技术人员。 使用场景及目标:用于制造业和其他相关行业中,解决零空闲流水车间调度的问题,从而优化生产效率和降低制造成本。 其他说明:该论文提供了完整的算法原理、实现步骤以及MATLAB实现的详细代码,方便读者理解和复现研究结果。文中还讨论了AOA算法的优越性及未来改进方向,为今后的研究提供了参考依据。

    递进关系-关系图表-多彩微软风-5.pptx

    递进关系-关系图表-多彩微软风-5

    条形图-数据图表-简约扁平-3.pptx

    图表分类ppt

    西南科技大学仿射密码实验报告

    一、实验目的 1.理解仿射密码的基本原理及加密、解密过程。 2.掌握利用 C 语言实现仿射密码加密与解密的基本方法。 3.通过实例观察仿射密码的加密效果及安全性。 4.通过实现简单的古典密码算法,理解密码学的相关概念,如明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。

    ACCENTURE - How luxury brands are reinventing for success_CAIG.pdf

    ACCENTURE - How luxury brands are reinventing for success_CAIG

    3b057疫情防控平台_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)技术,实现了前后端分离。

    springboot项目基于MVC框架自习室管理和预约系统设计与实现.zip

    springboot项目基于MVC框架自习室管理和预约系统设计与实现,含有完整的源码和报告文档

    3b058毕业论文管理系统小程序_springboot+vue+uniapp.zip

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

    饼图-数据图表-简约清新 3.pptx

    图表分类ppt

    基于java+springboot+vue+mysql的城镇保障性住房管理系统设计与实现.docx

    基于java+springboot+vue+mysql的城镇保障性住房管理系统设计与实现.docx

    springboot项目车险理赔信息管理系统修改代码.zip

    springboot项目车险理赔信息管理系统修改代码,含有完整的源码和报告文档

    奔跑上台阶层级关系PPT模板.pptx

    奔跑上台阶层级关系PPT模板

    基于java+springboot+vue+mysql的编程训练系统设计与实现.docx

    基于java+springboot+vue+mysql的编程训练系统设计与实现.docx

    PHP安全基础中文版CHM版讲解了最常见的一些攻击方式最新版本

    PHP语言因其在构建基于数据库驱动的动态网站时展现的高度灵活性,已成为最流行的网站开发工具之一。PHP能够与诸如MySql数据库和Apache服务器等其他开源软件完美结合。然而,随着越来越多的网站采用PHP进行开发,它们也逐渐成为了恶意攻击者的目标,这要求开发者必须做好应对攻击的准备。随着攻击频率的上升,安全问题变得日益重要。《PHP安全基础》一书详细讲解了最常见的攻击方式,并阐述了编写安全代码的方法。通过实践各种攻击手段及其应对策略,读者可以深入理解书中介绍的安全措施。 《PHP安全基础》专注于网络应用中最关键的方面,每一章都通过一个实例(如表单处理、数据库编程、SESSION管理及验证)来讲解。每一章都详细说明了潜在的攻击方法以及防范攻击的技巧。书中主要内容包括: - 防止跨站脚本攻击漏洞 - 防止SQL注入攻击 - 防止Session劫持 《PHP安全基础》的目录如下: - 前言 - 内容简介 - 本书每章都描述了PHP开发中的一个方面。每一章又分为多个小节,每一小节都对该方面的攻击方式和防范技巧进行了讲述。 - 第一章,简介 - 本章提供了安全原则和一些好的

    山形锥形柱状图PPT模板素材-1.pptx

    图表分类ppt

    家庭微网优化模型matlab 考虑家庭电器设备的微网优化模型,采用matlab编程,采用粒子群算法,模型考虑空调的气温调节作用,有相应参考资料

    家庭微网优化模型matlab 考虑家庭电器设备的微网优化模型,采用matlab编程,采用粒子群算法,模型考虑空调的气温调节作用,有相应参考资料。

Global site tag (gtag.js) - Google Analytics