0

我正在创建一个应用程序,它将从 .bmp 图像中读取图像字节/像素/数据并将其存储在 byte/char/int/etc 数组中。

现在,从这个数组中,我想从数组第 10 个索引中存储的数据中减去 10(十进制)。

我能够成功地将图像信息存储在创建的数组中。但是当我尝试将数组信息写回 .bmp 图像时,创建的图像是不可见的。

这是我试图这样做的一段代码。

在这段代码中,我不是从数组的第 10 个索引中减去 10

public class Test1 {

    public static void main(String[] args) throws IOException{
        File inputFile = new File("d://test.bmp");
        FileReader inputStream = new FileReader("d://test.bmp");
        FileOutputStream outputStream = new FileOutputStream("d://test1.bmp");
        /*
         * Create byte array large enough to hold the content of the file.
         * Use File.length to determine size of the file in bytes.
         */
        char fileContent[] = new char[(int)inputFile.length()];


        for(int i = 0; i < (int)inputFile.length(); i++){
            fileContent[i] = (char) inputStream.read();
        }

        for(int i = 0; i < (int)inputFile.length(); i++){
            outputStream.write(fileContent[i]);
        }
    }
}
4

3 回答 3

0

代替 char[],使用 byte[]

如果您的代码有效,这是一个修改版本:

public class Test {

public static void main(String[] args) throws IOException {
    File inputFile = new File("someinputfile.bmp");
    FileOutputStream outputStream = new FileOutputStream("outputfile.bmp");
    /*
     * Create byte array large enough to hold the content of the file.
     * Use File.length to determine size of the file in bytes.
     */
    byte fileContent[] = new byte[(int)inputFile.length()];


    new FileInputStream(inputFile).read(fileContent);

    for(int i = 0; i < (int)inputFile.length(); i++){
        outputStream.write(fileContent[i]);
    }

    outputStream.close();
 }
}
于 2013-02-05T09:47:47.257 回答
0

要使现有代码正常工作,您应该将 FileReader 替换为 FileInputStream。根据 FileReader javadoc:

FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。

如下修改您的示例

  public static void main(String[] args) throws IOException
 {
File inputFile = new File("d://test.bmp");
FileInputStream inputStream = new FileInputStream("d://test.bmp");
FileOutputStream outputStream = new FileOutputStream("d://test1.bmp");
/*
 * Create byte array large enough to hold the content of the file.
 * Use File.length to determine size of the file in bytes.
 */
byte fileContent[] = new byte[(int)inputFile.length()];

for(int i = 0; i < (int)inputFile.length(); i++){
    fileContent[i] =  (byte) inputStream.read();
}

inputStream.close();
for(int i = 0; i < (int)inputFile.length(); i++){
    outputStream.write(fileContent[i]);
}

outputStream.flush();
outputStream.close();

}

这项工作为我创建了原始图像的副本。

尽管如上面的评论中所述,这可能不是您要实现的目标的正确方法。

于 2013-02-05T10:23:03.417 回答
0

其他人指出您的代码中有错误(使用char而不是byte主要使用),但是,即使您修复了该问题,如果您更改文件中第 10 个字节的值,您最终可能会得到一个不可加载的图像。

这是因为,.bmp图像文件以包含有关文件的信息(颜色深度、尺寸……请参阅BMP 文件格式)的标题开始,然后是任何实际图像数据。具体来说,第 10 个字节是 4 字节整数的一部分,用于存储实际图像数据(像素阵列)的偏移量。所以从这个值中减去 10 可能会使偏移量指向文件中的错误点,并且你的图像加载器进行边界检查可能会认为这是无效的。

您真正想要做的是将图像作为图像加载并直接操作像素值。像这样的东西:

BufferedImage originalImage = ImageIO.read(new File("d://test.bmp"));
int rgb = originalImage.getRGB(10, 0);
originalImage.setRGB(rgb >= 10 ? rgb - 10 : 0);
ImageIO.write(originalImage, "bmp", new File("d://test1.bmp"));
于 2013-02-05T10:33:16.917 回答