Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение памяти при работе с картинками 
:(
    Опции темы
kol
Дата 12.9.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.9.2005

Репутация: нет
Всего: 1



Есть какие-то мысли по поводу того, как можно предсказать, что зууминг вызовет переполнение памяти и в соответствии с этим, заблокировать масштабирование?
PM MAIL   Вверх
LSD
Дата 12.9.2005, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(kol @ 12.9.2005, 15:39)
Есть какие-то мысли по поводу того, как можно предсказать, что зууминг вызовет переполнение памяти и в соответствии с этим, заблокировать масштабирование?

Да просто поймать его:
Код

private BufferedImage zoom(...) throws OutOfMemoryError
{
//do zoom
}
...
BufferedImage img;
try
{
img = zoom(...);
}
catch(OutOfMemoryError err)
{
 System.cg();//do clean
...
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kol
Дата 12.9.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.9.2005

Репутация: нет
Всего: 1



Че-то не ловится ... System.out.println("Scale error!"); не срабатывает почему-то. К тому же, я обнаружил, что переполнение происходит в тот момент, когда я делаю

"this.setIcon(new ImageIcon(scaledImage)); (это я с JLаbel)"

а если его закоментировать, то переполнения нет...

Код

private void zoomIn(double scale) throws OutOfMemoryError {

    double width,height;

               width = (double)scaledImage.getWidth(null) * (this.scale + scale);
    height = (double)scaledImage.getHeight(null) * (this.scale + scale);

        

scaledImage = scaledImage.getScaledInstance((int)width,(int) height,scaledImage.SCALE_FAST);        
this.setIcon(new ImageIcon(scaledImage));

}



Код


void scale(double scale, boolean flag){

    try{        
            zoomIn(scale);
                 }catch(OutOfMemoryError err){
        System.out.println("Scale error!");
                }




PM MAIL   Вверх
batigoal
Дата 12.9.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 3
Всего: 151



Цитата(LSD @ 12.9.2005, 15:46)
System.cg();//do clean

Только, наверное, gc() smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 12.9.2005, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



У меня все ловится, такой тестик:
Код
public class Test
{
  public static void main(String[] args)
  {
    try
    {
      zoomIn(0.0);
    }
    catch(OutOfMemoryError err)
    {
      System.err.println("Catch OutOfMemoryError");
    }
  }
  
  private static void zoomIn(double scale) throws OutOfMemoryError
  {
    byte[] ballast = new byte[1024 * 1024 * 10];
  }
}

Запускаю: java -Xmx10M Test, получаю: Catch OutOfMemoryError.

Приведи весь код если можешь.
Добавлено @ 17:21
Цитата(Lamer @ 12.9.2005, 16:53)
Только, наверное, gc()

Да, написание кода в IDE имеет свои преимущества smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kol
Дата 13.9.2005, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.9.2005

Репутация: нет
Всего: 1



По нажатию кнопки, вызывается метод scale(0.1,true). На тестируемой фотографии, после очередного вызова, в консоли выпадает Exception in thread "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space и ничего больше...


Код

public class ImageViewer extends JLabel{

    MyMain main;
    MyImage myImage;
    Image scaledImage;
    double width,height;
    double scale = 1.0;


    ImageViewer(MyMain main){
        this.main = main;
    }

    void setImage(MyImage myImage){
        this.myImage = myImage;
        scaledImage = myImage.getImage();
        this.setIcon(new ImageIcon(scaledImage));
    }


    void zoomIn(double scale) throws OutOfMemoryError {


        width = (double)scaledImage.getWidth(null) * (1.0+scale);
        height = (double)scaledImage.getHeight(null) * (1.0+scale);

        scaledImage = scaledImage.getScaledInstance((int)width,(int) height,scaledImage.SCALE_FAST);        
        this.setIcon(new ImageIcon(scaledImage));

    }

    void scale(double scale, boolean flag){

        try{
            if(flag){
                zoomIn(scale);
            }else{
//                zoomOut(scale);
            }
        }catch(OutOfMemoryError err){
            System.out.println("Scale error!");
        }
    }
}

PM MAIL   Вверх
LSD
Дата 13.9.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Все ловится, я немного переделал твой код (чтобы его можно было запустить)
Код
public class ImageViewer extends JLabel
{
  private Image scaledImage;
  private double width, height;
  private double scale = 1.0;

  public ImageViewer()
  {
  }

  public void setImage(Image image)
  {
    scaledImage = image;
    this.setIcon(new ImageIcon(scaledImage));
  }

  public void zoomIn(double scale) throws OutOfMemoryError
  {
    width = (double) scaledImage.getWidth(null) * (1.0 + scale);
    height = (double) scaledImage.getHeight(null) * (1.0 + scale);
    scaledImage = scaledImage.getScaledInstance( (int) width, (int) height, scaledImage.SCALE_FAST);
    this.setIcon(new ImageIcon(scaledImage));
  }

  public void scale(double scale, boolean flag)
  {
    try
    {
      if(flag)
      {
        zoomIn(scale);
      }
    }
    catch(OutOfMemoryError err)
    {
      System.out.println("Scale error!");
    }
  }

  public static void main(String[] args)
  {
    try
    {
      Image image = ImageIO.read(new File("037.jpg"));
      ImageViewer im = new ImageViewer();
      im.setImage(image);
      im.scale(0.1, true);
    }
    catch(OutOfMemoryError err)
    {
      System.out.println("Catch : " + err);
    }
    catch(IOException ex)
    {
      ex.printStackTrace();
    }
  }
}

Если я запускаю java -Xmx10M ImageViewer, то получаю Catch : java.lang.OutOfMemoryError: Java heap space
, т.е. банально не хватает памяти на загрузку картинки. А если запускаю java -Xmx11M ImageViewer то получаю Scale error!, нехватает памяти на масштабирование картинки.
Ты просто не везде где нужно перехватываешь ошибку, к сожалению OutOfMemoryError, не содерит стека вызова и понять где именно возникла ошибка не просто.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kol
Дата 13.9.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.9.2005

Репутация: нет
Всего: 1



Ну да, у тебя все точно так же... Сейчас поставлю ловушки везде, где только можно smile.
PM MAIL   Вверх
kol
Дата 13.9.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.9.2005

Репутация: нет
Всего: 1



Фантастика какая-то... Уже везде поставил ловушки, даже в таких местах, что аж смешно становится... Не ловит и все тут... Первый раз с такой проблемой столкнулся... Ладно, спасибо большое, за потраченное время, я сейчас буду другие части делать, а потом вернусь к масштабированию, а то так можно долго просидеть над ним.

Добавлено @ 14:02
LSD

Ник у тебя прикольный ;)
PM MAIL   Вверх
LSD
Дата 14.9.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(kol @ 13.9.2005, 15:01)
Ник у тебя прикольный ;)

Это не совсем то о чем ты подумал, глянь здесь, можешь и про свой ник написать smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 14.9.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 3
Всего: 151



Lonely
Liberal
Learning
Loving
Latent

+ Software Developer


Пошел банить себя за оффтоп smile



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
kol
Дата 15.9.2005, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.9.2005

Репутация: нет
Всего: 1



smile
PM MAIL   Вверх
ShurikA
Дата 23.11.2005, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: 1
Всего: 3



Интересно, у меня всё работает:

Код

package imageuploader;

import java.awt.Image;
import javax.swing.JLabel;
import java.io.File;
import javax.swing.ImageIcon;
import java.awt.Dimension;
import javax.imageio.ImageIO;
import java.io.IOException;


public class ImageFrame extends JLabel
{
    private ImageIcon img;
    private Image image, scaledImage;
    private double scale, width, height;
    private int maxSize;

    public ImageFrame(int size)
    {
        maxSize = size;
        this.setMaximumSize(new Dimension(maxSize,maxSize));
        this.setPreferredSize(new Dimension(maxSize,maxSize));
    }

    public ImageFrame(File f)
    {
        setNew(f);
    }

    public void setNew(File f)
    {
        try
        {
            image = ImageIO.read(f);
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }

        calculateScale();
        reScale();
        this.setIcon(new ImageIcon(scaledImage));
    }

    public void clear()
    {
        
    }

    private void reScale()
    {
        scaledImage = image.getScaledInstance((int) (width*scale), (int) (height*scale), 0);
    }

    private void calculateScale()
    {
        width = (double) image.getWidth(null);
        height = (double) image.getHeight(null);
        if(width>=height && width>maxSize)
            scale = (double) maxSize/width;
        else if (height>width && height>maxSize)
            scale = (double) maxSize/height;
        else
            scale = 1;
    }

}



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 23.11.2005, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(ShurikA @ 23.11.2005, 15:25)
Интересно, у меня всё работает:

А размер картинки какой и сколько памяти выделенно JVM?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 23.11.2005, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: 1
Всего: 3



Размеры самые разные, и очень большые тоже.
На тему памяти не знаю, ничего не менял. Как выставлем дефолт?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Апплеты | Следующая тема »


 




[ Время генерации скрипта: 0.0639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.