Работа с ImageSource картинок, загружаемых из сети
При работе с картинками (класс Image) иногда возникает соблазн ка-то её обработать - но вот незадача: при обработки картинуи имеющей удалённый источник (ImageSource), работа сильно замедляется - картинка каждый раз обновляется, а так как источник удалёный, то это обновление занимает время...
Для решения этой проблемы картинка грабится в память, а затем с ней можно делать всё, что угодно...
// Получаем картинку из интернета (функция из апплета,
// получить картинку из сети по ip можно и другими методами)
Image img_in = getImage(getCodeBase(),"image.jpg");
// создаеём объект MediaTracker, чтобы загрузить картинку полностью
MediaTracker mt.addImage(img_in, 0);
try
{
// Ждём, пока картинка загрузится полностью, если неважно,
// насклько загрузится картинка, а важно время, можно использоват mt.waitForID(0, time);
// где time - время в миллисекундах максимального ожидания загрузки
mt.waitForID(0);
}
// игнорируем все ошибки загрузки
catch(Exception e){}
// всё, объект больше не нужен
mt.removeImage(img_in);
// получаем размеры картинок
int w = img_in.getWidth(this), h = img_in.getHeight(this);
// создаём объект, в который будем грабить, после завершения грабления,
//в этом массиве останится карта картинки, где каждый этлемент обозначает
// точку в формате argb (alpha, red, green, blue)
int image = new int[w*h+1];
// процес грабления
PixelGrabber pg = new PixelGrabber(img_in, 0, 0, w, h, image, 0, w);
try
{
pg.grabPixels();
}
catch(Exception e){} //.. завершили процесс
// создаём новую картинку, теперь вся она - в памяти компьютера
Image img_out = createImage(new MemoryImageSource(w, h, image, 0, w));
Примечание:
Создать картинку из массива image можно успеть всегда, иногда можно обработать картинку, не прибегая к классу ImageFilter, для этого нужно просто знать 3 вещи.
Точка картинки с координатами x,y в массиве image доступна как image[y*w+x], а по argb можно эту точку разложить следующим образом:
если c - int значение точки из массива image, то
int a = (c & 0xff000000)>>24;
int r = (c & 0xff0000)>>16;
int g = (c & 0xff00)>>8;
int b = (c & 0xff);
где они все - значения соответствующих компонент, а свернуть это всё обратно можно, следующей функцией:
с = setRGB(a,r,g,b);
protected int setRGB(int a, int r, int g, int b)
{
a = a & 0xff;
r = r & 0xff;
g = g & 0xff;
b = b & 0xff;
return ((a << 24) | ((r << 16) | ((g << 8) | b)));
}