我还没有真正探索过Java的这一部分。我可以创建一个班级,比如学生,除了那个之外还有他/她的所有详细信息,除此之外,我还可以将他们的照片存储为数据成员吗?
基本上,每当我创建一个Student对象时,我都会传递一张图片作为其中一个参数?
所以,问题是,处理此类图像对象的最标准和最佳(在您看来)的方式是什么?
我对Java Swing类感到满意,所以如果可以使用它完成,那就太棒了。
答案 0 :(得分:2)
为了便于使用,我建议使用BufferedImage。
有两个选项,一个是由HRgiger提供的,你从不存储图像,而是每次加载它,另一个是直接将它存储在Student
实例中。
而不是将其存储为byte[] picture;
,因为您将来可能需要一些功能来保存图像。哪个BufferedImage
有,或者您可以轻松添加。
如你所说,你对Swing很满意,它很容易处理。请注意,我不会让学生自己渲染图像。只需为图像提供一个吸气剂,然后从相关方法中进行渲染。
一个简短的例子。
<强> Student.java 强>
public class Student {
private String name;
private BufferedImage image;
public Student (String name) {
this.name = name;
this.image = ImageIO.read(new File(name + ".png"));
}
public getName () {
return name;
}
public getImage () {
return image;
}
}
在绘制Student.image的地方有些绘画方法
private final List<Student> students = new ArrayList<>();
...
@override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (Student s : students) {
g.drawImage (s.getImage(), x, y, null);
}
}
paintComponent
需要以某种方式访问List<Student>
。你当然也可以画一个学生。
答案 1 :(得分:1)
如果您只想存储图像,而不对其进行任何操作,最好的选择是使用字节数组。
E.g。
byte[] picture;
以下是将文件转换为byte []的方法: http://www.mkyong.com/java/how-to-convert-file-into-an-array-of-bytes/
这是相反的转换: http://www.mkyong.com/java/how-to-convert-array-of-bytes-into-file/
答案 2 :(得分:1)
在学生对象中将 filePath 用作String
。这将是最便宜的内存消费者之一。当你需要调用类似的实用方法时:
public static BufferedImage getStudentImage(Student student) throws IOException{
return ImageIO.read(new File(student.getImagePath()));
}
答案 3 :(得分:0)
你可以有一个图像或字节[]或代表学生图片的东西,但这是一个大型数据成员,你每次引用学生时都可能不需要。更好的方法是对存储在数据库或文件系统中的图片进行id引用,然后仅在您希望显示图像时根据需要加载图像。