当前位置: 首页 > backend >正文

JavaSwing之--ImageImageIcon

Java Swing中的图标、图像

一、Image类

抽象类 Image 是表示图形图像的所有类的超类。

常见的关于图像的缩放算法常数字段如下

  • SCALE_DEFAULT:使用默认的缩放算法,通常等同于 SCALE_REPLICATE,适用于一般用途。

  • SCALE_FAST:强调速度优先,牺牲图像质量,适合实时显示或对性能要求高的场景。

  • SCALE_SMOOTH:强调图像质量优先,使用更平滑的插值算法,适合高质量缩放,但速度较慢。

  • SCALE_REPLICATE:使用像素复制算法,速度快但质量较低,适用于非精细图像缩放。

  • SCALE_AREA_AVERAGING:使用区域平均算法,计算缩放后每个像素的颜色是源图像对应区域的平均值,质量较高,但计算开销较大。

Java Swing中组件多以Icon图标为填充类型,当以Image对象创建图标时,需要将Image对象缩放,调用getScaledInstance(int width, int height, int hints)创建此图像的缩放版本,再根据需要将其生成Icon图标再应用到不同的组件中。技术实现逻辑可以为:首先创建一个ImageIcon对象指向图标,然后将给图标转化为Image对象,再调用方法获得符合需求尺寸的缩放图像,最后应用该图像。

// 创建一个 ImageIcon 实例,用于显示眼睛图标
ImageIcon icon2 =new ImageIcon("images/eye1.png","眼睛图标");
// 获取图标对应的 Image 对象
Image image2 = icon2.getImage();
// 将图像缩放为40x40像素,保持平滑缩放以保证图像质量
image2 = image2.getScaledInstance(40,40,Image.SCALE_SMOOTH);
二、Icon接口

Icon是一个表示固定尺寸的小图片的接口,通常用于装饰组件。

常用方法如下表所示。

方法名称功能描述
int getIconHeight()
int getIconWidth()返回图标的宽度。
void paintIcon(Component c, Graphics g, int x, int y)在指定位置绘制图标。
三、ImageIcon类

ImageIcon类是实现接口Icon的子类之一,根据图像绘制一个图标。

3.1 构造方法
方法名称功能描述
ImageIcon()创建一个未初始化的图像图标。
ImageIcon(byte[] imageData)从包含支持的图像格式(例如 GIF、JPEG 或(从 1.3 开始)PNG)的图像文件中读取的字节数组创建一个 ImageIcon。
ImageIcon(byte[] imageData, String description)从包含支持的图像格式(例如 GIF、JPEG 或(从 1.3 开始)PNG)的图像文件中读取的字节数组创建一个 ImageIcon。
ImageIcon(Image image)从图像对象创建一个 ImageIcon。
ImageIcon(Image image, String description)从图像创建一个 ImageIcon。
ImageIcon(String filename)从指定的文件创建一个 ImageIcon。
ImageIcon(String filename, String description)从指定的文件创建一个 ImageIcon。
ImageIcon(URL location)从指定的 URL 创建一个 ImageIcon。
ImageIcon(URL location, String description)从指定的 URL 创建一个 ImageIcon。
3.2 常用方法
方法名称功能描述
int getIconHeight()获取图标的高度。
int getIconWidth()获取图标的宽度。
Image getImage()返回此图标的 Image
int getImageLoadStatus()返回图像加载操作的状态。
protected void loadImage(Image image)加载图像,仅在加载图像时返回。
void paintIcon(Component c, Graphics g, int x, int y)绘制图标。
void setImage(Image image)设置此图标显示的图像。
void setImageObserver(ImageObserver observer)设置图像的图像观察者。
String toString()返回此图像的字符串表示形式。
四、ImageIcon类详解
4.1 构造方法
  • ImageIcon(byte[] imageData, String description) 从包含支持的图像格式(例如 GIF、JPEG 或(从 1.3 开始)PNG)的图像文件中读取的字节数组创建一个 ImageIcon。
//创建一个指向GIF文件的字节流对象
FileInputStream fis = new FileInputStream("images/50.gif");
//从文件字节流中读取所有字节存入数组
byte[] bytes = fis.readAllBytes();
//依据字节数组保存的图形数据创建一个ImageIcon对象
ImageIcon icon3 =new ImageIcon(bytes,"Gif图标");
//将图标添加到按钮、标签等组件中
  • ImageIcon(String filename, String description) : 从指定的文件创建一个 ImageIcon。
//创建jpg格式图片图标
ImageIcon icon4= new ImageIcon("images/map.jpg","jpg图标");
// 获取ImageIcon对象的Image对象
Image image4 = icon4.getImage();
// 将Image对象按指定宽度和高度进行平滑缩放
image4 = image4.getScaledInstance(40,40,Image.SCALE_SMOOTH);
// 使用缩放后的Image对象重新创建ImageIcon对象
icon4 = new ImageIcon(image4);
// 设置JLabel对象label4的图标为重新创建的ImageIcon对象
lable4.setIcon(icon4);
  • ImageIcon(Image image, String description) 从图像创建一个 ImageIcon。
// 创建一个 ImageIcon 实例,用于显示眼睛图标
ImageIcon icon2 =new ImageIcon("images/eye1.png","眼睛图标");
// 获取图标对应的 Image 对象
Image image2 = icon2.getImage();
// 将图像缩放为40x40像素,保持平滑缩放以保证图像质量
image2 = image2.getScaledInstance(40,40,Image.SCALE_SMOOTH);
// 使用缩放后的图像创建一个新的 ImageIcon 实例
icon2 = new ImageIcon(image2,"平滑缩放眼睛");
// 设置标签label2的图标为新的 ImageIcon 实例
label2.setIcon(icon2);

ImageIcon类的其它构造方法用法与以上举例方法基本相似,修改对应的参数即可创建所需的图标对象。

4.2 常用方法
  • Image getImage() :用以将该图标转化为Image对象。

在图标尺寸较大需要缩放时常用该方法将图标对象转换为Image对象,然后调用其缩放方法得到符合需求的Image对象,然后再根据需要使用。以上构造方法中已有讲解,不再赘述。

  • int getIconHeight(),nt getIconWidth() :获取图标的宽度和高度
//获取图片宽度和高度
int width = icon4.getIconWidth();
int height = icon4.getIconHeight();
  • void setImage(Image image) :设置此图标显示的图像。
 //创建jpg格式图片图标
ImageIcon icon4= new ImageIcon("images/map.jpg","jpg图标");
// 获取ImageIcon对象的Image对象
Image image4 = icon4.getImage();
// 将Image对象按指定宽度和高度进行平滑缩放
image4 = image4.getScaledInstance(40,40,Image.SCALE_SMOOTH);
// 设置图标显示的图像
icon4.setImage(image4);// 等同于 icon4 = new ImageIcon(image4);
  • paintIcon(Component c, Graphics g, int x, int y) 在指定位置绘制图标。

可用在创建组件时重写方法完成图标的绘制。

JLabel label = new JLabel("信息"){// 重写paintComponent方法,用于绘制组件@Overrideprotected void paintComponent(Graphics g) {// 调用父类的paintComponent方法以执行默认绘制逻辑super.paintComponent(g);// 创建一个ImageIcon实例,加载信息图标ImageIcon icon =new ImageIcon("images/info.png");// 获取图标的Image对象Image image = icon.getImage();// 按指定尺寸平滑缩放图像image = image.getScaledInstance(40,40,Image.SCALE_SMOOTH);// 使用缩放后的图像创建新的ImageIcon对象icon = new ImageIcon(image5);// 在指定位置绘制图标icon.paintIcon(this,g,10,10);}
};

其他方法如何应用请读者自行查阅官方文档和网络文献。

五、图片缩放

在Java Swing编程中,当某一图片作为组件的图标时,其宽度和高度常常超出预期,无法在组件上完整显示,此时需要按照一定模式缩放到符合需求的尺寸方能满足需求。图片的缩放需要借助Image类的Image getScaledInstance(int width, int height, int hints)方法,其中参数width、heigt表示目标图像的宽度和高度,hints表示缩放的算法,是Image类的常数。技术实现逻辑基本按照如下路径实现,在此基础上可以进一步优化。

①创建指向缩放图片的ImageIcon对象icon;

②以icon对象为参数创建一个Image对象image;

③调用getScaledInstance()方法,按照指定的宽度、高度和缩放算法缩放,将得到图像重新存储到image中;

④将image图像转型为icon对象;

⑤应用icon对象设置图标。

代码实现示例如下:

ImageIcon icon = new ImageIcon("图片路径");
Image image = icon.getImage();
image = image.getScaledInstance(宽度,高度,算法常数);//算法常数
icon.setImage(image);//icon = new ImageIcon(image);
component.setIcon(icon);//component为设置图标的组件

以按钮添加图标为例

// 创建一个无文本的按钮对象
JButton button = new JButton();
// 设置按钮的位置和大小
button.setBounds(50,50,60,40);
// 创建一个图像图标对象,指定图片路径
ImageIcon icon = new ImageIcon("images/java.png");
// 获取图标对象的图像
Image image = icon.getImage();
// 将图像缩放为指定大小,保持原始图像的比例和清晰度
image = image.getScaledInstance(30,30,Image.SCALE_SMOOTH);
// 更新图标对象的图像为缩放后的图像
icon.setImage(image);
// 设置按钮的图标为更新后的图标对象
button.setIcon(icon);

由于某些组件是以图像形式应用到组件上,根据需要只需缩放即可,不存在转换。

六、总结

在Java中Image是一个抽象类,Icon是一个接口,其实现要用到子类ImageIcon。

利用ImageIcon类封装的构造方法和普通方法,可以完成图标图像的各种操作,从而根据需要应用图像。

在Swing编程中经常用到图像的缩放,实现环节可能需要图片、图像类型之间的转换。

限于作者开发实践不足原因,关于图形图像正确的应用及深度应用,请关注官方JDK说明文档。

http://www.xdnf.cn/news/10142.html

相关文章:

  • ES5时代的残党(被ES6淘汰的JS写法)
  • 【Web应用】若依框架:基础篇11功能详解-系统接口
  • 聊聊网络变压器的浪涌等级标准是怎样划分的呢?
  • 强化学习笔记总结(结合论文)
  • 【知识点】第2章:Python程序实例解析
  • 玛哈特校平机深度解析:多辊弯曲的奥秘与核心部件探秘
  • Amazon Pinpoint:构建智能、全渠道的用户互动与营销解决方案
  • 进程间通信及管道(理论)
  • element上传文件多选 实现文件排序
  • 指纹识别+精准化POC攻击
  • 正点原子Z20 ZYNQ ​​​开发板​​发布!板载FMC LPC、LVDS LCD和WIFI蓝牙等接口,资料丰富!
  • It is recommended to disable TLS 1.1 and replace it with TLS 1.2 or higher.修复方案
  • LearnOpenGL-笔记-其十一
  • 突破DIFY沙箱限制,高效处理大文件
  • 人工智能在智能金融中的创新应用与未来趋势
  • 【面试】喜茶Java面试题目
  • 数学建模之最短路径问题
  • Spring Boot中使用@JsonAnyGetter和@JsonAnySetter处理动态JSON属性
  • Linux中的shell脚本
  • 基于Vite的前端自动化部署方案
  • (一)微服务(垂直AP/分布式缓存/装饰器Pattern)
  • Bootstrap项目 - 个人作品与成就展示网站
  • 【数据集】高分辨率(1 km)月尺度中国气候(降水+最高/低温)数据集(1952–2019)
  • 【目标检测】【ICCV 2021】条件式DETR实现快速训练收敛
  • Flume 自定义拦截器开发实战:添加时间戳与 JSON 处理
  • AI感知与行动:考拉悠然发布空间智能世界模型,让AI走进物理世界
  • AcroForm 表单:动态字段值调整及避免使用 “event.value“
  • 中国城市间地理距离矩阵(2024)
  • 历年南京理工大学计算机保研上机真题
  • linux常用命令笔记