【问题标题】:Merge Bitmap with standard Java将位图与标准 Java 合并
【发布时间】:2014-12-28 18:06:34
【问题描述】:

我已经找到了很多关于如何合并 bitmpaps 的实现,现在我正在尝试做同样的事情,但没有像我以前见过的所有尝试那样使用 Android jars。

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

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

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

将所有 128*128 px 的 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 进行了类似的尝试,效果很好,现在经过一些研究我注意到它也适用于 bmps,正确设置缓冲结果图像的类型整数枚举。

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

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

谢谢!

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

【问题讨论】:

  • 那么问题是什么? )
  • 垂直合并它们是什么意思

标签: java graphics bitmap


【解决方案1】:

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

此外,我还将BufferedImage 的构造替换为128*input.length 而不是128*16,因为这意味着您对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,但您可以取消此限制;
  • 你硬编码了很多常量。

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

【讨论】:

  • 我已经解释得更好了,无论如何,这段代码与我迄今为止所做的相同,并不是答案......
  • @Mark:我在第一个版本中犯了一个小错误,如果你使用新版本,我得到的图像在结果图片中被“合并”了......
  • 它没有。如果你想要你可以使用我的图片,我已经在这里上传了它们:filedropper.com/bs2originalfix
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多