我发现了很多关于如何合并bitmpaps的实现,现在我正在尝试做同样的事情,但没有Android jars,就像我以前见过的每一次尝试一样。
我有 16 张 128*128 像素的位图图像。
我需要垂直合并它们...结果我是一个完全黑色的BMP 128x128 * 16......所以它不起作用。
这是我到目前为止所做的:
将所有 128*128 像素的 Bmp 读取到缓冲图像数组中:
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);
这里是合并和保存方法:
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 个位图的连接,它们彼此重叠。
主要问题是你的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,则可以删除此约束;
- 你硬编码了很多常量。
也许你应该考虑让你的代码更通用,这样你就可以用它解决更多的问题。