2011-12-21 46 views
1

此问题与我的previous question有关,但您不需要阅读以便了解它。将位图写入大块文件android

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

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

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

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

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

+0

你是如何检查文件只有第一行的? – Deepak 2011-12-21 15:10:55

回答

3

我要抵制冲动,问为什么地球上你这样做,因为它效率非常低,所以让我们来看看。

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

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

这相当于在文本文件中有一个EOF标记。所有的线都被写入,但阅读时,读者第一EOF后放弃

您将需要研究的the structure of a PNG file以更加充分地了解发生了什么

+0

Thanx,你的答案看起来相当不错,但对于第一行,因为我在我的问题中给出了关于我以前的问题的链接。事情是,我想要做一些图像过滤,因为我需要转换int数组中的图像,这将会给我OOME所以我想分割图像的行,应用过滤器并将它们保存在文件中(重用变量/对象)。然后从文件中读取一些逻辑,并添加到ImageView ...看起来对我来说至少.. :) – Farhan 2011-12-21 15:54:55

+0

@farhan我真的不能使用标准api找出这一个。虽然您可以使用bitmapfactory轻松读取位图的较小部分,但不能编写位图的一部分。您可能需要寻找一个专门的库,它可以完成您正在寻找的任务,例如libPNG – Merlin 2011-12-22 00:02:50

+0

您的意思是说我们没有在sdk中选择libPNG ...我应该改变自己的逻辑吗?我正在考虑开始使用ImageBytes。 – Farhan 2011-12-22 06:03:46

1

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

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

+0

+1。你是对的,但我现在该怎么办? – Farhan 2011-12-21 15:55:34

+1

@farhan我同意梅林,你要求的是一个局部编码器,你可能需要特殊的库。 – Deepak 2011-12-22 05:03:03

0

您的逻辑错误,因为您无法将每行作为png追加到文件中。可能它有一些头文件,所以它们会在每次追加后追加。

+0

不一定,新的FileOutputStream第二个参数是追加 – njzk2 2011-12-21 15:25:28

+1

对不起,是的,我刚刚看到它。 – Caner 2011-12-21 15:30:58