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说明文档。