我還沒有真正探索過這部分的Java。我可以創建一個班,說學生有他/她的所有詳細信息,如姓名,身份證和所有,但除此之外,我還可以存儲他們的照片,作爲數據成員?是否可以添加圖像(png)作爲Java類的屬性?
基本上,無論何時我創建一個Student對象,我都會傳入一張圖片作爲其參數之一?
所以,問題是,什麼是最標準和最好(在你看來)處理這種圖像對象的方式?
我對Java Swing類很熟悉,所以如果可以使用它,它將會非常棒。
我還沒有真正探索過這部分的Java。我可以創建一個班,說學生有他/她的所有詳細信息,如姓名,身份證和所有,但除此之外,我還可以存儲他們的照片,作爲數據成員?是否可以添加圖像(png)作爲Java類的屬性?
基本上,無論何時我創建一個Student對象,我都會傳入一張圖片作爲其參數之一?
所以,問題是,什麼是最標準和最好(在你看來)處理這種圖像對象的方式?
我對Java Swing類很熟悉,所以如果可以使用它,它將會非常棒。
如果您只想存儲圖像,而不對其進行任何操作,最好的選擇是使用一個字節數組。
例如
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/
你可以有一個圖像或字節[]什麼代表學生的照片,但這是一個大型數據成員,你可能不需要每次參考學生。更好的做法可能是將存儲在數據庫或文件系統中的圖片作爲id引用,然後只在需要顯示圖片時根據需要加載圖片。
爲便於使用,我建議您使用BufferedImage。
有兩個選項,其中一個由HRgiger提供,您永遠不會存儲圖像,而不是每次加載它,另一個是直接將其存儲在Student
實例中。
而不是將其存儲爲byte[] picture;
,因爲您可能需要將來爲圖像提供一些功能。其中BufferedImage
有,或者你可以很容易地添加到它。
正如你所說,你對Swing很滿意,它很容易處理。請注意,我不會讓學生渲染圖片本身。只需爲圖像提供一個getter並從相關方法中渲染即可。
一個簡短的例子。
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;
}
}
一些paint方法的地方在那裏是有意義的油漆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>
。你當然也可以畫一個學生。
您可以用一個例子來解釋一下,因爲我非常喜歡這個想法,並且曾經使用過BufferedImages。 –
@BrendonMcCullum,現在寫一個快速的,不要猶豫,要求進一步的幫助。您可以使用[drawImage](https://docs.oracle.com/javase/tutorial/2d/images/drawimage.html)作爲了解自定義'paintComponent'以及如何在Swing中繪製圖像的參考。 – Emz
使用文件路徑爲String
在學生對象。這將是您最便宜的內存消費者之一。而當你需要調用一個實用程序方法類似的東西:
public static BufferedImage getStudentImage(Student student) throws IOException{
return ImageIO.read(new File(student.getImagePath()));
}
如果你不必訪問我經常推薦這個圖片的圖片。在這裏,您可以輕鬆地構建過濾器以及我的答案中簡要提及的所有內容,但您不需要直接在'Student'類中存儲'BufferedImage'。但是,如果您經常閱讀圖片,我會推薦我的解決方案。 – Emz
爲什麼會是如果圖像存在,每次你引用的是學生的時候出了問題?這並不是說你實際上是在發送節目中的學生。你只是發送一個指向學生對象的指針。 – Emz
假設你有一羣100k學生。現在,您已經爲垃圾回收器生成了一堆垃圾,您可能只需要5%的時間。 – digitaljoel
我明白了。我喜歡這個提議。由於我有很多圖像,因此將它們存儲在數據庫中將是一條可行的路線。你能否詳細說明或者鏈接到解釋它的過程? –