Как я могу использовать Graphics и Affinetransform для рисования перспективного изображенияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как я могу использовать Graphics и Affinetransform для рисования перспективного изображения

Сообщение Anonymous »

Я хочу нарисовать изображение с помощью Java.
И я хочу повернуть это изображение по оси X или Y, чтобы сделать изображение перспективным.
Это может сделать изображение трехмерным.Знаете ли вы функцию «3D-поворот» в PowerPoint? Я просто хочу добиться такого эффекта.
Могу ли я использовать Java для этого?
Мне жаль, что я раньше не подробно описал свой вопрос.
Это исходное изображение:
исходное изображение
Я добавил операцию сдвига, когда рисовал его

Код: Выделить всё

@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d  = (Graphics2D)g;
g2d.clearRect(0, 0, this.getWidth(), this.getHeight());
if (sourceImage != null) {
g2d.shear(0.5, 0);
g2d.drawImage(sourceImage, 0, 0, sourceImage.getWidth(), sourceImage.getHeight(), null);
}
}
И тогда это выглядит так
Преобразованное изображение
Но это линейное преобразование, я хочу перспективное изображение, вот так
Чего мне нужно достичь
AffineTransform в JAVA может выполнять только линейные преобразования.
Как можно Я использую PerspectiveTransform. Нужно ли мне использовать OpenGL или OpenCV для достижения это?
Это мой полный код

Код: Выделить всё

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class ImagePanel extends JPanel{

private static final long serialVersionUID = 1L;

private BufferedImage sourceImage;

public ImagePanel() {
}

@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d  = (Graphics2D)g;
g2d.clearRect(0, 0, this.getWidth(), this.getHeight());
if (sourceImage != null) {
g2d.shear(0.5, 0);
g2d.drawImage(sourceImage, 0, 0, sourceImage.getWidth(), sourceImage.getHeight(), null);
}
}

public BufferedImage getSourceImage() {
return sourceImage;
}

public void setSourceImage(BufferedImage sourceImage) {
this.sourceImage = sourceImage;
}

Код: Выделить всё

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

public class MainUI extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;

public static final String IMAGE_CMD = "choose image ... ";

private JButton imgBtn;

private ImagePanel imagePanel;

private BufferedImage srcImage;

public MainUI() {
setTitle("image demo");
imgBtn = new JButton(IMAGE_CMD);

JPanel btnPanel = new JPanel();
btnPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
btnPanel.add(imgBtn);

imagePanel = new ImagePanel();
getContentPane().setLayout(new BorderLayout());
getContentPane().add(imagePanel, BorderLayout.CENTER);
getContentPane().add(btnPanel, BorderLayout.SOUTH);

imgBtn.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
if(IMAGE_CMD.equals(e.getActionCommand())){
try {
JFileChooser chooser = new JFileChooser();
setFileTypeFilter(chooser);
chooser.showOpenDialog(null);
File f = chooser.getSelectedFile();
if (f != null) {
srcImage = ImageIO.read(f);
imagePanel.setSourceImage(srcImage);
imagePanel.repaint();
}
} catch (IOException e1) {
e1.printStackTrace();
}
imagePanel.repaint();
}
}
public void setFileTypeFilter(JFileChooser chooser){
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & PNG Images", "jpg", "png");
chooser.setFileFilter(filter);
}
public void openView(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(1280, 960));
pack();
setVisible(true);
}
public static void main(String[] args) {
MainUI ui = new MainUI();
ui.openView();
}
}

Подробнее здесь: https://stackoverflow.com/questions/718 ... ve-picture
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»