Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

эффект волны
Список форумов
 ->  Работа с изображениями (Advanced Imaging API)


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Strelock : 10
Новичок

СообщениеМай 05, 2010 13:22 
Ответить с цитатой
Необходимо создать приложения не используя стандартные jogl и прочие библиотеки, которые бы создавали эффект волны по какой-либо картинке...вот рыщу в инете уже несколько дней, лучшее, что нашел по работе с графикой в java у Вас. Научился у вас для начала, загружать файлы и выводить на фрейм( просмотрел и поигрался с zoom-примером). Может, кто помочь?)

Необходимо реализовать вот такой эффект :


дайте хоть какие-нибудь ссылки...
К началу Посмотреть профиль Отправить личное сообщение
gocha : 42
Новичок

СообщениеМай 08, 2010 23:55 
Ответить с цитатой
Ссылки Confused вообще ты можешь воспользоваться по пиксельной обработкой если скорость не критична getRGB() / setRGB() (см. java.awt.image ...)

А такой эффект как я понимаю - это просто синусоида для y со смещением по x.

Последовательно обходишь каждую точку новой картинки слева направо, сверху вниз. Вычисляешь для каждой из них координаты их исходной картинки

y* - это координата точки для который ты вычисляеш цвет из исходной картинки

x* - соответ.

y* = kY * sin( x ) where x > dStartX & x <= dEndX
y* = y where !( x > dStartX & x <= dEndX )


поскольку у тебя одна волна то ты ограничиваешь ее в диапазоне значений dStartX dEndX, если x* в этом диапазоне то вычисляешь согласно синусоиде (интерполяция значений x dStartX - dEndX)

kY - Это высота волны.

Если ты задашь диапазон (StartX dEndX) константой, то волна будет вертикально, а в твоем случае ее нужно под 45 градусов, тогда тебе нужно чтоб диапазон менялся в зависимости от x*

Вот как-то так
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Strelock : 10
Новичок

СообщениеМай 10, 2010 23:42 
Ответить с цитатой
Спасибо, уже что-то более-менее выходит, только вот проблема, когда хочу сделать анимацию, то есть создать аффект пробега волны, то есть необходимость каждый раз перегружать bufferimage, для того чтобы снова была изначальная картинка. Пытался уже двумя способами, но результата не дает:
1-ый:
Код:

....
try {
         image = ImageIO.read(new File("diablo_3_icon.jpg"));
         bufferedImage = ImageIO.read(new File("diablo_3_icon.jpg"));
         bufferedImage2 = ImageIO.read(new File("diablo_3_icon.jpg"));
      } catch (IOException ex) {
         ex.printStackTrace();
      }
....
bufferedImage-bufferedImage2;

2-ой
не прошел, возможно за счет того, что идет ссылочное объявление...
попробывал каждый раз перед циклом прописать следующее:
Код:

try {
            bufferedImage = ImageIO.read(new File("diablo_3_icon.jpg"));
         } catch (IOException ex) {
            ex.printStackTrace();
         }
К началу Посмотреть профиль Отправить личное сообщение
gocha : 42
Новичок

СообщениеМай 11, 2010 6:21 
Ответить с цитатой
Не думаю что ссылочные объявление тут чем-то мешает.

Картинку перезагружать каждый раз Confused , лучше храни оригинал в памяти, а новую картинку создавай на основе оригинала.

А чтоб волна бегала тебе нужно циклично сдвигать диапазон, т.е. увеличивать/уменьшать значения dStartX dEndX перед выводом картинки на экран.

Думаю ты знаешь о таком классе как java.awt.image.BufferedImage и его методах как copyData, createGraphics, getRaster, getRGB, setRGB, во всяком случаи я использовал бы их для этой задачи
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Strelock : 10
Новичок

СообщениеМай 11, 2010 8:46 
Ответить с цитатой
Да я их использовал, но в чем дело...ка я выше уже описал, когда я пытаюсь передать снова значение изначальной картинки - этого не происходит....
К началу Посмотреть профиль Отправить личное сообщение
gocha : 42
Новичок

СообщениеМай 11, 2010 8:56 
Ответить с цитатой
Тогда затрудняюсь ответить, наверно нужно смотреть весь код
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Strelock : 10
Новичок

СообщениеМай 11, 2010 9:06 
Ответить с цитатой
Код:

// Изменение масштаба части изображения

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

@SuppressWarnings("serial")
class PreviewZoomImage extends JFrame {
   private Image image;
   // ширина изображения
   private int width;
   // высота изображения
   private int height;
   // копия буфера изображения
   private BufferedImage bufferedImage,bufferedImage2;
   // цвет пикселя
   private Color color;
   // коэфициент света
   private int conf = 3;
   // максимальное смещение по X
   private int dStartX=0;
   // максимальное снижение по X
   private int dEndX=60;
   // выста волны
   private int kY=15;
   //счетчики
   private int i,j,xNew,yNew;
   

   public PreviewZoomImage() {
      setTitle("PreviewImage");

      try {
         image = ImageIO.read(new File("diablo_3_icon.jpg"));
         bufferedImage = ImageIO.read(new File("diablo_3_icon.jpg"));
         bufferedImage2 = ImageIO.read(new File("diablo_3_icon.jpg"));
      } catch (IOException ex) {
         ex.printStackTrace();
      }
      
      width = image.getWidth(this);
      height = image.getHeight(this);
      setLocationRelativeTo(null);
      setSize(width, height);

      setMaximizedBounds(new Rectangle(width, height));

      DrawPanel drawLabel = new DrawPanel(width);

      add(drawLabel);

      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setVisible(true);
   }

   public static void main(String[] args) {
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      } catch (Exception e) {
      }
      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            JFrame frame = new PreviewZoomImage();
            frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
         }
      });
   }

   public class DrawPanel extends JLabel implements Runnable {

      private int maxCheck;

      public DrawPanel(int width) {
         super();
         maxCheck = height - 15;
         new Thread(this).start();
      }

      @Override
      public void run() {
         j = 15;
         while (j < maxCheck) {
            j += 1;
            repaint();
            try {
               Thread.sleep(5);
            } catch (InterruptedException ex) {
            }
         }
      }

      public void paintComponent(Graphics g) {
         
         for (j=15;j<height-15;j++) {
            for(i=0; i<width ;i++){
               yNew = Math.round( (float)( kY*Math.sin( (float) (Math.PI/32)*i) ) ) ;
               int c =bufferedImage2.getRGB(i, j);
               //for(int z=0;z< Math.abs(yNew);z++) bufferedImage.setRGB(i, j+z, c);
               for(int z=0;z< Math.abs(yNew);z++)
                  if (yNew>=0) bufferedImage.setRGB(i, j-z, c);
                  else {
                     bufferedImage.setRGB(i, j+z, c);
                  }
            }
         }
         g.drawImage(bufferedImage, 0, 0, width, height, null);
      }
   }

}
К началу Посмотреть профиль Отправить личное сообщение
Peroxide : 46
Новичок

СообщениеОкт 26, 2011 21:57 
Ответить с цитатой
Спасибо! С этим проблема решена.
Не знал, что оно так просто.
К началу Посмотреть профиль Отправить личное сообщение
vimba : 147
Новичок
Откуда: Шахты

СообщениеОкт 26, 2011 22:58 
Ответить с цитатой
Я в своё время скомуниздил этот апплет http://javaboutique.internet.com/Lake/, правда пришлось чуть-чуть ковырнуть чтобы перевести с awt на swing, но там по моему пару строчек кода нужно было изменить.
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Работа с изображениями (Advanced Imaging API)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru