gpt4 book ai didi

Java:使用 FileOutputStream 保存大 .bmp 文件

转载 作者:行者123 更新时间:2023-12-01 04:15:43 25 4
gpt4 key购买 nike

我正在尝试编写一个应用程序来生成和保存 Julia sets 的高分辨率图像。 ,但我有一个问题。我的代码正在创建一个文件,其大小几乎与(在我看来)应有的大小相对应,但是当我尝试打开它时,出现一条有关文件过早结束的错误消息。

我基本上采用了一个 size*size 的正方形,然后对于这个正方形的每个像素,我从复平面计算相应的数字(从 -1.5 - 1.5i 到 1,5 + 1.5i 的片段),然后我正在启动一个算法来确定它是否属于某个 Julia 集(我完全确定它可以正常工作,因此您不必担心它)。

我想生成非常高分辨率(至少是 20k*20k 像素)的图像,所以我想用某种输出流来实现。我已经使用 BufferedImage、ImageIO.write() 等生成了此类图像,但这些图像不适用于接近 9k*9k 像素的图像(JVM 堆大小问题)。我只是补充一下,这是我第一次尝试逐字节创建这样的文件。

这是我的代码:

import java.io.FileOutputStream;
import java.io.IOException;

public class Save_big_bmp{
public static void main(String[] args) throws IOException{
int size, filesize;
byte[] pixelColorBGR = new byte[3];
boolean prisoner;

size=1000;
filesize=(3*size*size)+54;
Complex c = new Complex(-0.1, 0.65);

byte[] header=
{66, 77, (byte)((filesize >> 24) & 0xFF), (byte)((filesize >> 16) & 0xFF),
(byte)((filesize >> 8) & 0xFF), (byte)(filesize & 0xFF), 0, 0, 0, 0, 0, 0, 0, 54,
0, 0, 0, 40, (byte)((size >> 24) & 0xFF), (byte)((size >> 16) & 0xFF),
(byte)((size >> 8) & 0xFF), (byte)(size & 0xFF), (byte)((size >> 24) & 0xFF),
(byte)((size >> 16) & 0xFF), (byte)((size >> 8) & 0xFF), (byte)(size & 0xFF), 0, 1, 0, 24,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

FileOutputStream output = new FileOutputStream("output.bmp");
output.write(header);

for(int i=0;i<size;i++){
for(int j=size;j>=0;j--){
Complex z0 = new Complex(((double)i*3/size)-1.5,1.5-((double)j*3/size));
prisoner = true;

for(int k=0;k<1000;k++){
z0 = z0.squared();
z0 = z0.add(c);

if(z0.dist()>2){
prisoner = false;
break;
}
}
if(!prisoner){
pixelColorBGR[0]=0; pixelColorBGR[1]=0; pixelColorBGR[2]=0;
output.write(pixelColorBGR);
}if(prisoner){
pixelColorBGR[0]= (byte) 0xFF; pixelColorBGR[1]=(byte) 0xFF; pixelColorBGR[2]=(byte) 0xFF;
output.write(pixelColorBGR);
}
}
}
output.close();
}
}

提前致谢!

最佳答案

标题中的所有数字必须为 little-endian 。例如,当将 54 表示为四个字节时,这四个字节必须是 54, 0, 0, 0。要将 24 表示为两个字节,这两个字节必须是 24, 0。

请注意,每行像素都必须填充为 4 字节的精确倍数。只要 size 是 1000 的倍数,这就不会造成问题,但如果您打算接受任意大小,则需要在大小计算中考虑填充,并且当您完成每行像素的写入。

与您的问题无关但值得注意的是 Windows 位图以相反的顺序包含其行。如果在位图标题中将图像高度指定为正数,则需要先写入最后一行,然后写入倒数第二行,依此类推。但是,如果您在标题中将图像高度指定为负数(即 -size),则可以按从上到下的顺序写出行。 (这对于 Julia 集来说可能并不是那么重要。)

关于Java:使用 FileOutputStream 保存大 .bmp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com