2

这个问题与我之前的问题有关,但您无需阅读即可理解它。

现在我试图将位图转换成更小的部分,然后保存那些更小的部分。

我得到的问题是,只有第一部分保存在比完整图像大得多的文件中。下面是我正在使用的代码:

for (int i = 0; i < Image.getHeight(); i++)
{
    fout = new FileOutputStream(file, true);
    Bitmap temp = Bitmap.createBitmap(Image, 0, i,Image.getWidth(), 1);
    temp.compress(Bitmap.CompressFormat.PNG, 100, fout);
    fout.flush();
    fout.close();
}

代码非常简单,但我不明白为什么文件中只有第一行被写入。

更新:: Merlin 和 Deepak 是对的。我现在尝试给出不同的名称,并且所有部分都成功写入了不同的文件。现在您知道问题所在了,我应该从第二个块中删除标头并从第一个块中删除 eof 还是什么?

4

3 回答 3

3

我要忍住问你到底为什么要这样做的冲动,因为它效率很低,所以让我们来看看。

因此,您一次写入一行像素,但您将它们重复写入同一个文件,并将附加标志设置为 true,这是正确的。

您错过了一个事实,即当您编写位图时,您正在编写的是自包含的。因此,读取第一行的程序将期望它是整个位图。

这相当于在文本文件中有一个 EOF 标记。所有的行都在写,但是当阅读它时,读者在第一个 EOF 之后放弃了

您需要研究PNG 文件的结构以更全面地了解正在发生的事情

于 2011-12-21T15:09:00.783 回答
1

由于您一个接一个地附加压缩文件 (.png),因此打开生成的文件将只显示第一位编码数据,这是您的第一行。这也是合乎逻辑的,因为编码的图像标头具有包含编码内容的字节数,并且解码器不会在结束标记之后打扰文件中的其余数据。

我只是尝试在另一个文件的末尾复制一个 .png 文件,当我打开文件时,我看到了未更改的第一张图像!

于 2011-12-21T15:16:34.867 回答
1

您的逻辑是错误的,因为您不能将每一行作为 png 附加到文件中。可能它有一些标题内容,所以它们会在每次附加之后附加。

于 2011-12-21T15:18:52.227 回答