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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение изображения с экрана, Как сохранить такое изображение в файл 
V
    Опции темы
criolit
  Дата 28.9.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем!
Пишу графическую прогу. Пользователь может рисовать там всякое. Но вот встала проблема: как эти художества получить из Canvas? Была идея создать изображение через createImage(int rgb[], ....). Но изображение получается намного меньше, чем экран. Вот что я делаю:

Код

class Graph extends Canvas {

    private int width;
    private int height;
    private int rgb[];
    private Image image;

    public Graph() {
        super();
        width = getWidth();
        height = getHeight();

        rgb = new int[width * height];

                // рисую линию; для проверки
        for (int i = 0, k = 0; i < width && k < height; i++, k++) {
            rgb[i + k * width] = 0x00ff0000;
        }

        image = Image.createRGBImage(rgb, width, height, false);
    }

    public void paint(Graphics g) {
        g.fillRect(0, 0, width, height);
        g.drawImage(image, 0, 0, g.HCENTER | g.VCENTER);
    }
}


И уже в главном коде создаю объект этого класса:

Код

Graph graph = new Graph();
Display display = Display.getDisplay(this);
display.setCurrent(graph);


Может быть есть еще какой вариант? Прошу помочь. Заранее спасибо.
PM MAIL   Вверх
Dancer
Дата 28.9.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



i < width && k < height;
получим квадрат со строной либо width либо height в зависимости от того, "кто" из них меньше
не совсем правильно сделан цикл. разберитесь с ограничением значений.
Лучше для проверки залить всё цветом, так сразу будет понятнее.
Код



      for (int i = 0;i < height; i++) {
          for(int k=0;k < width; k++) {
            rgb[i*width + k] = 0x00ff0000;
          }
      }

        image = Image.createRGBImage(rgb, width, height, false);


Это сообщение отредактировал(а) Dancer - 28.9.2006, 12:23


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
criolit
Дата 28.9.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Когда массив инициализируется все его элементы имеют значение 0. Рисуется просто черный квадрат. А линию это я для проверки рисую, просто посмотреть рисует ли он вообще что-то. Если я делаю заливку методом fillRect() используя значения width и height, то весь экран нормально заливается, а через createImage() только часть почему-то. Может есть какие-то ограничения?
PM MAIL   Вверх
Dancer
Дата 28.9.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



ага, есть ограничения!!!!
g.drawImage(image, 0, 0, g.HCENTER | g.VCENTER);

не желаешь поправить на 
g.drawImage(image, 0, 0, g.LEFT | g.TOP);

Это сообщение отредактировал(а) Dancer - 28.9.2006, 15:28


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
criolit
  Дата 28.9.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну и толку с этого? Да на весь экран залил изображение. Но мне надо чтобы рисунок был в объекте класса Image. Этот рисунок надо сохранить потом в виде графического файла. Поэтому я и городил:

Код

rgb = new int[width * height];

for (int i = 0, k = 0; i < width && k < height; i++, k++) {
    rgb[i + k * width] = 0x00ff0000;
}

image = Image.createRGBImage(rgb, width, height, false);

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



g.drawImage(image, 0, 0, g.HCENTER | g.VCENTER);

заменить на 

g.drawImage(image, 0, 0, g.LEFT | g.TOP);
или на 
g.drawImage(image, (int)(width/2), (int)(height/2), g.HCENTER | g.VCENTER);




--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
criolit
  Дата 28.9.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Отлично. Заработало. Огромное спасибо. Только если не сложно, поясни почему мой вариант не работает.
PM MAIL   Вверх
Dancer
Дата 28.9.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



Ды работает твой вариант, работает smile, ты получаешь массив с точками, тот который формируешь, просто ты его выводишь для просмотра не совсем правильно, а именно. Ты его (точнее уже полученную каартинку из своего массива) пытаешься вывести на экран в точку с координатами 0,0 (то есть левый вехний угол). Вот из этго левого верхнего угла начанает твой массив выводиться, но с какой позиции он должен выводиться, то есть якорь? ты это дело и указываешь g.HCENTER | g.VCENTER, то есть центр твоей картинки должен располагаться в точке 0,0 твоего экрана, на который ты хочешь вывести свою картинку. 
Если же ты сделаешь g.TOP|g.LEFT , то ты будешь выводить свою картинку из левого верхнего угла твоей картинки в левый верхний угол экрана (координата 0, 0).
В документации вроде бы это объясняется. Посмотри про Anchor получше.


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
criolit
  Дата 28.9.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Был невнимателен. Вопрос закрыт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

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


 




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


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

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