【问题标题】:drawing your own buffered image on frame在框架上绘制自己的缓冲图像
【发布时间】:2012-06-25 05:00:25
【问题描述】:

我有一个与我的帧大小相同的缓冲图像:

public BufferedImage img;
public static int WIDTH = 800;
public static int HEIGHT = 600;
img=new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);

如何绘制它,以便我可以看到只有黑色图像填充框架?不使用画布

我只想使用图形中的 drawImage 函数,而不使用 paint 或 paintComponent 函数

如果可能,我如何将一维数组 [WIDTH*HEIGHT] 分配给该图像?

简单地说:我想创建一个图像,将数组中的值转换为像素(0=black,999999999=lightblue 等)并将其绘制到屏幕上。

编辑:

这是没有按预期工作的代码(它应该是一个带有黑色绘制图像的框架)但只是一个空白框架。为什么图像没有添加到框架中?

  import javax.swing.*;

  import java.awt.Canvas;
  import java.awt.Graphics;
  import java.awt.image.BufferStrategy;
  import java.awt.image.BufferedImage;
  import java.awt.image.DataBufferInt;

  public class test extends Canvas{

public static JFrame frame;
public static int WIDTH = 800;
public static int HEIGHT = 600;

public test(){
    
}

public static void main(String[] a){
    
        test t=new test();
        frame = new JFrame("WINDOW");
        frame.add(t);
        frame.pack();
        frame.setVisible(true);
        frame.setSize(WIDTH, HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        t.start();
    
}

public void start(){
    
    BufferedImage img = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
    int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
    boolean running=true;
    while(running){
        BufferStrategy bs=this.getBufferStrategy();
        if(bs==null){
            createBufferStrategy(4);
            return;
        }
        for (int i = 0; i < WIDTH * HEIGHT; i++)
            pixels[i] = 0;
        
        Graphics g= bs.getDrawGraphics();
        g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
        g.dispose();
        bs.show();
        
    }
}}

【问题讨论】:

  • 如果您想要黑色背景,请添加一个面板(带有黑色背景)并将其设置为内容窗格。如果要在框架中添加图像,请将图像添加到ImageIcon,使用图标制作JLabel,然后将标签添加到框架。顺便说一句,通常最好描述最终效果或用户特征,而不是告诉我们您“想要”或“不想要”什么。目标就是功能,您只需专注于实现该目标的(可能有缺陷的)策略。
  • 我想要帧上的缓冲图像(使用代码创建的图像,未加载)。我想要它黑色,因为我将使用数组修改像素,然后将数组的值添加到图像中。例如,我将使用自己的算法绘制一个矩形(我不喜欢使用 drawrect 函数)
  • 所有这些以“我想要”开头的东西并没有告诉我任何我可以用来帮助你的东西。目标是什么?您提供的功能是什么?例如。 “提供多语言支持”是一项功能 “更白、更亮、更泡沫”是一项功能..
  • 这是一个从头开始制作的图形引擎(使用我自己的算法来绘制东西)。我正在尝试将数组转换为图像,然后在屏幕上绘制该图像。(希望我是清除)
  • 好的。那更清楚了。为了尽快获得更好的帮助,请发布您的最佳尝试SSCCE

标签: java arrays image draw bufferedimage


【解决方案1】:

据我了解您想要达到的目标(“不是很多”),这可能会给您一些提示。框架和图像的构造在我看来仍然不整洁,但请看一下。

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.*;

public class TestImageDraw {

    public static JFrame frame;
    BufferedImage img;
    public static int WIDTH = 800;
    public static int HEIGHT = 600;

    public TestImageDraw() {
    }

    public static void main(String[] a){

        TestImageDraw t=new TestImageDraw();

        frame = new JFrame("WINDOW");
        frame.setVisible(true);

        t.start();
        frame.add(new JLabel(new ImageIcon(t.getImage())));

        frame.pack();
//      frame.setSize(WIDTH, HEIGHT);
        // Better to DISPOSE than EXIT
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public Image getImage() {
        return img;
    }

    public void start(){

        img = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
        int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
        boolean running=true;
        while(running){
            BufferStrategy bs=frame.getBufferStrategy();
            if(bs==null){
                frame.createBufferStrategy(4);
                return;
            }
            for (int i = 0; i < WIDTH * HEIGHT; i++)
                pixels[i] = 0;

            Graphics g= bs.getDrawGraphics();
            g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
            g.dispose();
            bs.show();

        }
    }
}

一般提示

  • 请对代码块使用一致且符合逻辑的缩进。
  • 请了解类、方法和属性名称的常见Java naming conventions(特别是用于名称的大小写)并始终如一地使用它。
  • 给测试类一个有意义的名字,例如TestImageDraw
  • 在 EDT 上创建和更新 Swing GUI。
  • 不要无故混用 Swing 和 AWT 组件。

【讨论】:

  • 我印象深刻,它运行良好。干得好。但是我尝试将此代码放在一个单独的类中,以便可以使用对象访问它。当我为此创建对象时,它会调用构造函数,因此在构造函数中我需要调用其他函数(需要重命名 main ) 然后使用 TestImageDraw t=new TestImageDraw(); 再次创建对象并再次调用构造函数等。如何通过导入类并创建对象来使用此代码,然后出现这个黑色窗口?
  • 我必须承认我不太理解调用createBufferStrategy() 的原因,而不是使用标准BufferedImage,如在第一个代码sn-p 中实例化的那样。这使设置可见的框架、将框架打包为图像大小以及获取图像的顺序变得复杂。首先,我希望改变这一点。
  • OK.Shortly:你怎么能给朋友一个包含这个代码的文件,当他创建这个类的对象时,他有同样的结果。
  • (耸耸肩)视情况而定。使用缓冲区策略创建图像有什么真正的原因吗?
  • “你在吗?”(笑)你的预算是多少?如果是 0$,那么请理解我有 很多 个我自己更感兴趣的项目。获得合作的最佳选择是在 SourceForge 或 Github 上启动一个开源项目或喜欢。一旦您有了其他人感兴趣的想法,他们就会开始使用 API,您将获得协作。很高兴你解决了眼前的问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多