【问题标题】:Using Graphics2D to Manipulate an Image Multiple Times使用 Graphics2D 多次处理图像
【发布时间】:2015-07-02 23:56:43
【问题描述】:

我正在尝试弄清楚如何拍摄图像并使用 Graphics2D 对其进行操作,同时能够对同一图像执行多项操作(因此将其变暗两次会使它比一次变暗)。我发现的每一个例子都是为了处理一次图像并显示它。我需要能够多次显示图像。例如,假设我有一个包含选项 1、2、3 等的菜单,1 将其变暗,2 将其变亮,3 显示图像。

我将如何实现这一目标?我可以获取图像,将其变暗,旋转并显示它,但不能通过菜单或其他用户选择何时何地的方式。如果有人可以将我链接到一个可以做到这一点的网页,或者写一个简短的(越短越好)一个类程序来做我描述的事情,我应该可以开始了。

基本上,我需要能够做这样的事情:

initialize image;
display(image);
lighten(image);

我不明白的是,我如何使用 Graphics2D 操作图像,并将其应用于我的图像。

这是我目前所拥有的(主要来自here):

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ShowImage extends JPanel {
Image img;

        public ShowImage() {
            super();
            img = Toolkit.getDefaultToolkit().getImage("image.png");
        }

        public void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.translate(170, 0);
            g2d.rotate(1);
            g2d.drawImage(img, 0, 0, this);
        }

        public static void main(String arg[]) {
            JFrame frame = new JFrame("Image Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600, 400);

            ShowImage panel = new ShowImage();
            frame.setContentPane(panel);
            frame.setVisible(true);
    }
}

目前,我在paintComponent() 中进行所有操作,因此操作起来一点也不轻松。有没有办法在 main 中设置 Graphics2D 变量,然后以某种方式将其放入 paintComponent() 中?我完全不知道该怎么做。

我尝试发布我查看过的所有网页的链接,但它不允许我发布超过两个链接,因为我是新手。

【问题讨论】:

    标签: java image graphics2d


    【解决方案1】:

    如果您需要在内存中操作图像,请创建一个 BufferedImage,然后调用 BufferedImage.createGraphics() 以访问用于绘制到图像缓冲区中的图形对象。

    当您想将该图像渲染到 UI 中的组件上时,请使用该组件的 paintComponent() 方法,就像您所做的那样。请注意,这涉及两个独立的图形对象,用于两种不同的目的。

    【讨论】:

    • 所以我尝试按照您所说的写this,但是,我没有显示图像,只是一个空白应用程序。
    • 小心不要混淆你的图像和缓冲区。在paintComponent() 中,使用g.drawImage(),而不是g2d.drawImage()。在您的 main 方法的最后一行,您正在将图像绘制到属于同一图像的缓冲区上,这可能会导致问题。为渲染创建一个单独的图像缓冲区(不要使用与您的源图像之一相同的图像对象)。
    • 好的,所以我在paintComponent() 中有g.drawImage(),但我仍然不确定如何绘制旋转后的图像。更改paintComponent() 并删除main 中的最后一行后,它只绘制常规图像而不是旋转图像。
    • 您之前的内容(“main 中的最后一行”)很好......只需为您从磁盘加载的源图像和您将要使用的缓冲区使用不同的图像缓冲区将您的输出渲染到。
    • 抱歉,我还是没听懂。你能给我一个简单的例子来说明这将如何运作吗?我不明白你想让我做什么。我应该创建第二个 BufferedImage、Graphics、Graphics2D 还是其他东西?
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2014-12-09
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多