-
November 19th, 2011, 09:31 AM
#1
Loading images fast to JLabel icon
Hello,
In my code, im loading a bunch of images to create a sort of gallery,
I want to know if there is a faster way to load images than what i have done here.. it seems really slow and resource intensive
This is my code..
Code:
Thread t = new Thread(){
public void run(){
GlobalVariables.setLoadImageThreads(GlobalVariables.getLoadImageThreads()+1);
if(GlobalVariables.PET_VIEW_IS_ACTIVE){
JLabel imgLabel = new JLabel();
imgLabel.setName(pic.getPreviewName());
imgLabel.setToolTipText("Double click to open");
imgLabel.addMouseListener(new LabelImageMouseListener(tablePictures, pic.getPictureId(), pic.getFilePath()));
//imgLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1, false));
imgLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1));
PictureUtil.setImageToLabelIcon(pic.getFilePath(), pic.getPreviewName(), imgLabel, 100, 100);
panePictures.add(imgLabel);
}
GlobalVariables.setLoadImageThreads(GlobalVariables.getLoadImageThreads()-1);
}
};
loadImageThreads.add(t);
This is the code for PictureUtil.setImageToLabelIcon
Code:
public static void setImageToLabelIcon(String filePath, String previewName, JLabel label, int maxW, int maxH) {
try {
int maxWidth = maxW;
int maxHeight = maxH;
int newWidth = 0;
int newHeight = 0;
if (previewName == null) {
previewName = "000";
}
BufferedImage scaledImage = null;
File previewImg = new File("imgs/" + previewName + ".jpg");
if (previewImg.exists()) {
scaledImage = ImageIO.read(previewImg);
} else {
BufferedImage myPicture = ImageIO.read(new File(filePath));
double percentDrop = 1d;
double percentDrop1 = 1d;
double percentDrop2 = 1d;
double width = myPicture.getWidth();
double height = myPicture.getHeight();
if (width > maxWidth) {
percentDrop1 = maxWidth / width;
}
if (height > maxHeight) {
percentDrop2 = maxHeight / height;
}
if (percentDrop1 > percentDrop2) {
percentDrop = percentDrop2;
} else {
percentDrop = percentDrop1;
}
newWidth = (int) (Math.floor(myPicture.getWidth() * percentDrop));
newHeight = (int) (Math.floor(myPicture.getHeight() * percentDrop));
scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = scaledImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(myPicture, 0, 0, newWidth, newHeight, null);
graphics2D.dispose();
PictureUtil.flushImages(myPicture);
if(!previewName.equals("000"))
PictureUtil.saveImage(scaledImage, previewName, "jpg");
}
label.setIcon((new ImageIcon(scaledImage)));
PictureUtil.flushImages(scaledImage);
} catch (IOException ex) {
Logger.getLogger(PictureUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
This is the saveImage method im using, note that i only use this when a thumbnail does not exist. If it exists, it just loads the image.
Code:
public static void saveImage(BufferedImage image,String fileName, String ext) {
File dir = new File("imgs/");
if(!dir.exists()){
dir.mkdir();
}
File file = new File("imgs/"+fileName + "." + ext);
try {
if(!file.exists())
ImageIO.write(image, ext, file);
} catch(IOException e) {
System.out.println("Write error for " + file.getPath() +": " + e.getMessage());
}
}
Individually, an image doesnt really take long, but if I want to load 700 images.. this takes minutes...
This is what i did to try to make this faster...
Each thread in this arraylist contains threads from the first piece of code.
Code:
int i = 0;
int limitIncrease = 10;
int nextLimit = limitIncrease;
long timeSpentWaiting = 0;
for(Thread t:loadImageThreads){
if(GlobalVariables.LOAD_IMAGES_FAST && GlobalVariables.PICTURE_TAB_ACTIVE){
limitIncrease = 10;
}else{
limitIncrease = 1;
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(LoadThumbnails.class.getName()).log(Level.SEVERE, null, ex);
}
}
//VALIDATES THAT THE WINDOW IS OPEN, TO AVOID UNNECESSARY LOADING.
if(!GlobalVariables.PET_VIEW_IS_ACTIVE){
break;
}
while(GlobalVariables.getLoadImageThreads() > 0 && i == nextLimit && nextLimit != loadImageThreads.size()){
try {
if(timeSpentWaiting > 10000){
GlobalVariables.setLoadImageThreads(0);
}
timeSpentWaiting += 200;
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(LoadThumbnails.class.getName()).log(Level.SEVERE, null, ex);
}
}
timeSpentWaiting = 0;
if(i==nextLimit){
nextLimit += limitIncrease;
//ONLY UPDATE THE UI IF THE PICTURE TAB IS ACTIVE
if(GlobalVariables.PICTURE_TAB_ACTIVE){
panePictures.updateUI();
}
}
t.start();
i++;
}
i hope someone can help me with this.. thanks in advance
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|