将位图与标准Java合并

将位图与标准Java合并,java,graphics,bitmap,Java,Graphics,Bitmap,我已经找到了很多关于如何合并bitmpaps的实现,现在我正在尝试做同样的事情,但是没有Android JAR,就像我以前看到的每一次尝试一样 我有16个128*128像素的位图图像 我需要垂直合并它们…结果我是一个完全黑色的bmp 128x128*16…所以它不工作 这就是我到目前为止所做的: 将128*128 px分片的所有BMP读取到BuffereImage数组中: BufferedImage[] input = new BufferedImage[16]; int

我已经找到了很多关于如何合并bitmpaps的实现,现在我正在尝试做同样的事情,但是没有Android JAR,就像我以前看到的每一次尝试一样

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

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

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

将128*128 px分片的所有BMP读取到BuffereImage数组中:

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())); 
    }
publicstaticvoidmergeandsave(buffereImage输入[])抛出IOException{
BuffereImage bimage=新的BuffereImage(128,128*input.length,BuffereImage.TYPE_BYTE_BINARY);
Graphics g=bimage.createGraphics();
int y=0;
对于(int i=0;i
现在我已经为png做了类似的尝试,效果很好,现在经过一些研究,我注意到它也可以用于bmps,正确设置缓冲结果图像的整数枚举类型

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

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

谢谢

编辑:抱歉,伙计们,我在单循环上留下了上一个实验值,但我显然尝试了完整的图像循环。 现在我知道这段代码并不精彩,但它只是一个简单的抓取目标。
垂直合并它们意味着我得到了16个相同尺寸(128*128)的位图,我想得到一个结果位图,这将是开始16个位图的连接,其中它们是一个在另一个之上。

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

此外,我还用
128*input.length
取代了
buffereImage
的结构,而不是
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())); 
}
publicstaticvoidmergeandsave(buffereImage输入[])抛出IOException{
int type=BufferedImage.type\u BYTE\u BINARY;
BuffereImage双图像=新的BuffereImage(128,128*input.length,type);
Graphics g=bimage.createGraphics();
int y=0;
对于(int i=0;i
然而,另一方面,我认为这段代码的构造不是很好。它对图像做了很多假设。这使得代码几乎不可重用,这是好代码的主要方面之一:

  • 假设所有图像都具有相同的128x128大小,您可以放弃此约束
  • 您硬编码了很多常量

也许你应该考虑让你的代码更通用,这样你就可以用它来解决更多的问题。< /P>那么问题是什么?你说垂直合并是什么意思?我解释得更清楚了,无论如何,这段代码与我到目前为止所做的相同,不是答案…@马克:我在第一个版本中犯了一个小错误,如果你使用新版本,我会得到在结果图片中“合并”的图像…它不会。如果你想使用我的图片,我已经上传到这里: