【问题标题】:Write bitmap to file in chunks android将位图写入块中的文件android
【发布时间】:2012-01-25 09:04:37
【问题描述】:

此问题与我的previous question 有关,但您无需阅读即可理解。

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

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

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();
}

代码很简单,但我不明白为什么文件中只有第一行。

更新:: 梅林和迪帕克是对的。我现在尝试使用不同的名称,所有部分都成功写入不同的文件。现在你知道问题所在了,我应该从第二个块中删除 header 并从第一个块中删除 eof 还是什么?

【问题讨论】:

  • 你是如何检查文件只有第一行的?

标签: android file bitmap fileoutputstream


【解决方案1】:

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

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

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

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

您需要研究 the structure of a PNG file 以更全面地了解正在发生的事情

【讨论】:

  • Thanx,您的答案看起来还不错,但对于第一行,因为我在我的问题中提供了关于我之前的问题的链接。问题是,我想做一些图像过滤,因为我需要将图像转换为 int 数组,这当然会给我 OOME 所以我想将图像分成行,应用过滤器并将它们保存在文件中(重用变量/对象)。然后用一些逻辑从文件中读取并添加到 ImageView... 至少对我来说看起来不错.. :)
  • @farhan 我真的无法使用标准 api 解决这个问题。虽然您可以使用 bitmapfactory 轻松读取位图的较小部分,但不能写入位图的片段。你可能需要寻找一个专业的图书馆来做你正在寻找的事情,例如 libPNG
  • 你的意思是说我们在 sdk 中没有 libPNG 的替代品......我应该改变我的逻辑吗?我正在考虑开始使用 ImageBytes。
  • 问题是将图像写入 PNG 文件。您可以只使用 BitmapFactory 获取位图的一部分,然后使用 bitmap.setpixels() 但问题是之后将图像写出。
  • 这可能效率低下,但在我的情况下,我需要分块下载文件,我无法将它们保存在 SQLite 中,或者如果大小大于 2Mb 则无法获取它们
【解决方案2】:

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

【讨论】:

  • 不一定,新的 FileOutputStream 第二个参数是 append
【解决方案3】:

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

我只是尝试在另一个文件的末尾复制一个 .png 文件,当我打开文件时,我看到的第一张图片没有改变!

【讨论】:

  • @farhan 我同意 Merlin 的观点,你要求的是一个部分编码器,你可能需要特殊的库。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
相关资源
最近更新 更多