java - 什么是图 block 以及它们是如何在 BufferedImage 中创建的

标签 java bitmap bufferedimage

我前段时间在 sun java 论坛上发布了一个问题,我发现很难理解我从回复者那里收到的第一个回复,尽管他似乎给了我解决问题的正确方法。问题的链接是:

http://forums.sun.com/thread.jspa?threadID=5436562&tstart=0

有人回答说我应该使用 BufferedImage 来制作图 block 。我不太明白这些图 block 与 BufferedImage 相关的含义。

我希望有人能向我解释图 block 是什么以及它们是如何在 BufferedImage 中创建的。

我在网上搜索了一段时间,但找不到任何可以帮助我了解磁贴基础知识和创建磁贴的链接。也欢迎任何指向站点的指针。

我需要帮助来理解与 BufferedImage 相关的图 block 以及它们的创建方式。

最佳答案

2D 游戏中的“图 block ”仅表示 “小于整个屏幕的图像,您可以多次重复使用它来创建背景”

这是一个工作示例,其中创建了四个图 block (向每个像素添加了一些随机噪声)。每个图 block 为 50x50 像素。

然后有一个“ map ”(在您的案例中称为“网格”)表示您要将哪些图 block 放在哪里。

从该映射中,创建了一个更大的 BufferedImage(请注意,这只是一个示例,在实际程序中,您需要使用 BufferedImage 副本,而不是逐像素副本) .

map 为 9x7,每个图 block 为 50x50 像素,因此生成的图像为 9*50 x 7*50(即 450 x 350)。

请注意,以下实际上只是一个简单的示例,尽可能简短,展示了如何使用多个图 block 创建更大的 BufferedImage:目标不是提供有关最佳 Swing 用法的教程,也不是关于如何从 BufferedImages 等中榨取每一点性能。

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class ToyTiled extends JFrame {

    private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;

    private BufferedImage img;

    public static void main( String[] args ) {
        new ToyTiled();
    }

    public ToyTiled() {
        super();
        this.add(new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                g.drawImage(img, 0, 0, null);
            }

        });
        img = new BufferedImage( 450, 350, IMAGE_TYPE );   // here you should create a compatible BufferedImage
        this.setSize(img.getWidth(), img.getHeight());
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);


        final int NB_TILES = 4;
        BufferedImage[] tiles = new BufferedImage[NB_TILES];
        tiles[0] = createOneTile( new Color( 255, 255, 255 ) );
        tiles[1] = createOneTile( new Color( 255,   0, 255 ) );
        tiles[2] = createOneTile( new Color(   0,   0, 255 ) );
        tiles[3] = createOneTile( new Color(   0, 255, 255 ) );  

        final int[][] map = new int[][] {
                { 1, 0, 2, 3, 0, 1, 2, 2, 2 },
                { 0, 2, 3, 0, 1, 2, 2, 2, 3 },
                { 1, 0, 2, 3, 0, 1, 2, 2, 2 },
                { 2, 1, 0, 1, 2, 3, 2, 0, 0 },
                { 1, 0, 2, 3, 0, 1, 2, 2, 3 },
                { 1, 0, 2, 2, 1, 1, 2, 2, 3 },
                { 1, 0, 2, 3, 0, 1, 2, 2, 3 },
        };

        for (int i = 0; i < map[0].length; i++) {
            for (int j = 0; j < map.length; j++) {
                final BufferedImage tile = tiles[map[j][i]];
                for (int x = 0; x < tile.getWidth(); x++) {
                    for (int y = 0; y < tile.getHeight(); y++) {
                        img.setRGB( x + i * 50, y + j * 50, tile.getRGB(x,y) );
                    }
                }
            }
        }

        this.setVisible( true );
    }

    private BufferedImage createOneTile( final Color c ) {
        final Random r = new Random();
        final BufferedImage res = new BufferedImage( 50, 50, IMAGE_TYPE );
        for (int x = 0; x < res.getWidth(); x++) {
            for (int y = 0; y < res.getHeight(); y++) {
                res.setRGB( x, y, c.getRGB() - r.nextInt(150) );
            }
        }
        return res;
    }

}

关于java - 什么是图 block 以及它们是如何在 BufferedImage 中创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2782068/

相关文章:

java - libgdx: Sprite 像玻璃一样 splinter

java - ImageLabel 未显示在 BorderLayout.NORTH 中 - Java Swing

java - HSQLDB 语句和 Java NaN double

java - 回收 ImageView 的 Bitmap

android - 如何使用 ACTION_DEVICE_STORAGE_LOW 来避免 OutOfMemoryError?

java - 带有 BufferedImage 的 setRGB 提供不正确的着色

java - Glassfish 3.1.2.2 上 Web 应用程序的上下文路径

c - 为什么我的位图绘制函数在我给它的位置偏移处绘制? (C VGA 模式 12h)

java - 组合多个graphics2d 复合 Material ?

JAVA:为什么图像加载速度比应用程序、Window Frame 慢?