Mardcore (11.02.2012), uncopyable (08.02.2012)
Thema: ImageLoader
-
08.02.2012, 12:26 #1
- Registriert seit
- 19.12.2011
- Beiträge
- 356
Thanked 164 Times in 101 PostsImageLoader
Diese Klasse erlaubt es Bilder von einer URL zu laden und zu cachen.
PHP-Code:package KCClient.UI;
import java.awt.Image;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;
/**
*
* @author DeKaDeNz
*/
public class ImageLoader {
static HashMap<String, Image> images = new HashMap<>();
static String codeBase = "http://chat.knuddels.de/";
public static void setCodeBase(String base)
{
codeBase = base;
}
static private class ImageLoaderThread extends Thread
{
URL url;
String relative;
public ImageLoaderThread(URL uri, String r)
{
url = uri;
relative = r;
}
public void run()
{
loadImage();
}
public void loadImage()
{
try {
Image img = ImageIO.read(url);
ImageLoader.setImage(img, relative);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
public static void setImage(Image img, String relative)
{
images.remove(relative);
images.put(relative, img);
}
public static Image getImage(String relativeUrl)
{
if(images.containsKey(relativeUrl))
{
return images.get(relativeUrl);
}
try {
URL url = new URL(codeBase+relativeUrl);
System.out.println(url.toString());
images.put(relativeUrl, null);
new ImageLoaderThread(url, relativeUrl).start();
return null;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
public static void clearCache()
{
images.clear();
}
}
Wer es benötigt hier noch eine Klasse um Bilder zu preloaden:
PHP-Code:public class PreloadImages {
static String preloadImagesString = "/pics/icon_fullChannel.gif";
public static void preloadImages()
{
String[] preloadImages = preloadImagesString.split(";");
for(String imgrel : preloadImages)
{
if(imgrel.isEmpty())
continue;
while(ImageLoader.getImage(imgrel)==null)
try { Thread.sleep(1); } catch (InterruptedException ex) { }
}
}
}
Geändert von DeKaDeNz (08.02.2012 um 12:43 Uhr)
-
The Following 2 Users Say Thank You to DeKaDeNz For This Useful Post:
-
14.04.2012, 11:57 #2
AW: ImageLoader
Mir ist aufgefallen, dass die Klasse das Bild in einem neuem Thread lädt, falls es noch nicht gecached wurde und dann null als Bild returned....
Dadurch kann das Bild erst gezeichnet werden, wenn es 1. heruntergeladen ist, und 2. die Komponente die das Bild nutzt die repainted wird. Ich habe die entsprechende Methode um einen Parameter erweitert. Dort kann man dann eine Componente angeben, diese wird nach Bilddownload automatisch repainted.
PHP-Code:
import java.awt.Component;
import java.awt.Image;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;
/**
*
* @author DeKaDeNz
*/
public class ImageLoader {
static HashMap<String, Image> images = new HashMap<>();
static String codeBase = "http://chat.knuddels.de/";
public static void setCodeBase(String base)
{
codeBase = base;
}
static private class ImageLoaderThread extends Thread
{
URL url;
String relative;
Component send;
public ImageLoaderThread(URL uri, String r, Component sender)
{
url = uri;
relative = r;
send = sender;
}
public void run()
{
loadImage();
}
public void loadImage()
{
try {
Image img = ImageIO.read(url);
ImageLoader.setImage(img, relative);
if(send!=null)
send.repaint();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
public static void setImage(Image img, String relative)
{
images.remove(relative);
images.put(relative, img);
}
public static Image getImage(String relativeUrl) {
return ImageLoader.getImage(relativeUrl, null);
}
public static Image getImage(String relativeUrl, Component sender)
{
if(images.containsKey(relativeUrl))
{
return images.get(relativeUrl);
}
try {
URL url = new URL(codeBase+relativeUrl);
System.out.println(url.toString());
images.put(relativeUrl, null);
new ImageLoaderThread(url, relativeUrl, sender).start();
return null;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
public static void clearCache()
{
images.clear();
}
}
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.