|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
Strelock : 10 Новичок
|
Май 05, 2010 13:22 |
|
|
Необходимо создать приложения не используя стандартные jogl и прочие библиотеки, которые бы создавали эффект волны по какой-либо картинке...вот рыщу в инете уже несколько дней, лучшее, что нашел по работе с графикой в java у Вас. Научился у вас для начала, загружать файлы и выводить на фрейм( просмотрел и поигрался с zoom-примером). Может, кто помочь?)
Необходимо реализовать вот такой эффект :
дайте хоть какие-нибудь ссылки... |
|
|
|
 |
gocha : 42 Новичок
|
Май 08, 2010 23:55 |
|
|
Ссылки вообще ты можешь воспользоваться по пиксельной обработкой если скорость не критична 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 |
|
|
Не думаю что ссылочные объявление тут чем-то мешает.
Картинку перезагружать каждый раз , лучше храни оригинал в памяти, а новую картинку создавай на основе оригинала.
А чтоб волна бегала тебе нужно циклично сдвигать диапазон, т.е. увеличивать/уменьшать значения 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, но там по моему пару строчек кода нужно было изменить. |
|
|
|
 |
|
|
|