java - 将位图与标准 Java 合并

标签 java graphics bitmap

我发现了很多关于如何合并 bitmpap 的实现,现在我正在尝试做同样的事情,但不像我之前见过的每次尝试那样使用 Android jar。

我有 16 个 128*128 像素的位图图像。

我需要垂直合并它们...结果是一个全黑的 bmp 128x128*16...所以它不起作用。

这是我到目前为止所做的:

将所有 128*128 像素图 block 的 Bmp 读取到 BufferedImage 数组中:

BufferedImage[] input = new BufferedImage[16];   
        int counter = 0;
        for(File f: new File(fixBmpPathFolder).listFiles()){
            System.out.println(f.getAbsolutePath() + " loaded!");
            int type = BufferedImage.TYPE_BYTE_BINARY;

            input[counter]  =  new BufferedImage(ImageIO.read( f ).getWidth(null), ImageIO.read( f ).getHeight(null), type); 
            counter++;
        } 
        mergeAndSave(input); 

这里是 mergeAndSave 方法:

   public static void mergeAndSave(BufferedImage input[]) throws IOException {   
        BufferedImage bimage = new BufferedImage(128, 128*input.length, BufferedImage.TYPE_BYTE_BINARY);
        Graphics g = bimage.createGraphics();
        int y = 0;
        for ( int i = 0; i < input.length; i++ ) { //replaced by input.length
            g.drawImage( input[i],0,y,null); 
            y += 128;
        }   
        g.dispose(); 
        ImageIO.write(bimage, "BMP", new FileOutputStream(getFileResultAbsoluteName())); 
    }

现在我对 png 进行了类似的尝试,效果很好,现在经过一些研究,我发现它也适用于 bmp,正确设置缓冲结果图像的类型整数枚举。

我已经为单个 bmp 运行了这段代码,它可以工作,只需读取并保存在另一个地方即可。

根据我的需要,文件必须是二进制类型结果。

谢谢!

编辑:抱歉,我把最后一个实验值留在了单循环上,但我显然已经尝试过完整的图像循环。 现在我知道这段代码并不出色,但它只是实现目标的一个简单的划痕。 垂直合并它们意味着我有 16 个相同尺寸的位图 (128*128),并且我想得到一个结果位图,它将是起始 16 个位图的连接,其中它们是一个在彼此之上。

最佳答案

主要问题是你的for循环,你已经硬编码了1的边界,你当然需要用input.length替换它。

此外,我还用 128*input.length 而不是 128*16 替换了 BufferedImage 的构造,因为这意味着您硬编码了 16 图像。

最后,我将 hcount 重命名为 y,因为这是一个更语义化的名称。

public static void mergeAndSave(BufferedImage input[]) throws IOException {  
    int type = BufferedImage.TYPE_BYTE_BINARY;
    BufferedImage bimage = new BufferedImage(128, 128*input.length, type);
    Graphics g = bimage.createGraphics();
    int y = 0;
    for ( int i = 0; i < input.length; i++ ) { //replaced by input.length
        g.drawImage( input[i],0,y,null); 
        y += 128;
    }   
    g.dispose(); 
    ImageIO.write(bimage, "BMP", new FileOutputStream(getFileResultAbsoluteName())); 
}

但另一方面,我认为这段代码的构造不是很好。它对图像做出了很多假设。这使得代码几乎不可重用,这是优秀代码的主要方面之一:

  • 您假设所有图像的尺寸均相同,均为 128x128,但您可以放弃此限制;
  • 您对很多常量进行了硬编码。

也许您应该考虑使您的代码更加通用,这样您就可以用它解决更多问题。

关于java - 将位图与标准 Java 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27679148/

相关文章:

c++ - 如何让我的 TileSheet 包装起来?

java - 列出 java 中目录中的固定文件数

java - “发送消息时出错”Firebase 云消息服务

java - 如何通过ListAdpter显示多张图片?

java - 如何时不时地查看线程中的值?

Java 到 Android 的转换问题

java-me - 创建原生位图库

带有非 GUI 设备的 R dev.copy() 用于批处理图形脚本

java - 使用自定义图形层运行专有 [java] 应用程序

Android 在解码位图时返回 null