gpt4 book ai didi

Android:BitmapFactory.decodeByteArray 给出像素化位图

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:02 28 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,它可以显示从 Flickr 下载的照片。我从一个字节数组中获取一个位图对象,该数组又从相关的 Flickr URL 中读取,如下所示:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);

然后我在 View 对象的 onDraw 方法中将位图绘制到 Canvas 上:

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint);

问题是生成的图片是像素化的,我不知道为什么;我已经尝试了多种 opt 和 paint 对象的变体,但没有成功。我的应用程序中显示的图片与原始网址中的图片之间的差异大致如下所示:

Bad image, see pixelation in top left corner http://homepages.inf.ed.ac.uk/s0677975/bad.jpg

Good picture, this is the expected result http://homepages.inf.ed.ac.uk/s0677975/good.jpg

看例如在左上角的云中查看差异。

请注意,从项目资源加载并以类似方式绘制的 JPEG 图片显示得很好,即没有像素化。

谁能告诉我为什么会这样?

详细一点,字节数组是从Flickr获取的,如下所示;这是基于 Romain Guy 的 Photostream 应用程序的代码:

InputStream in = new BufferedInputStream(url.openStream(), IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();

PS:我还在 android.developer Google 组上发布了这个问题的变体。


非常感谢您的建议——现在我真的很困惑!我按照你的建议做了,发现直接从下载的字节数组产生的图像确实是像素化的。但是,这是从完全相同的 URL 下载的,当在我的计算机上访问该 URL 时,它没有像素化。这是相应的 Flickr URL:

http://farm3.static.flickr.com/2678/4315351421_54e8cdb8e5.jpg

更奇怪的是,当我在模拟器中而不是在我的手机(HTC Hero)上运行相同的应用程序时,没有像素化。

这怎么可能?

下面是我用于从 URL 加载位图的代码——它基于 Romain Guy 的 Photostream 应用程序,并结合了 Will 将原始字节数组写入文件的建议:

Bitmap loadPhotoBitmap(URL url) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;

try {

FileOutputStream fos = new FileOutputStream("/sdcard/photo-tmp.jpg");
BufferedOutputStream bfs = new BufferedOutputStream(fos);

in = new BufferedInputStream(url.openStream(),
IO_BUFFER_SIZE);

final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();

bfs.write(data, 0, data.length);
bfs.flush();

BitmapFactory.Options opt = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);

} catch (IOException e) {
android.util.Log.e(LOG_TAG, "Could not load photo: " + this, e);
} finally {
closeStream(in);
closeStream(out)
closeStream(bfs);
}

return bitmap;
}

private static void copy(InputStream in, OutputStream out) throws IOException {
byte[] b = new byte[IO_BUFFER_SIZE];
int read;
while ((read = in.read(b)) != -1) {
out.write(b, 0, read);
}
}

private static void closeStream(Closeable stream) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
android.util.Log.e(LOG_TAG, "Could not close stream", e);
}
}
}

我在这里要疯了吗?最好的,迈克尔。

最佳答案

好吧,我终于明白了:我的移动网络似乎对图像进行了压缩以节省带宽。

因此,从我的手机下载的图片质量低于从我的计算机下载的相同图片。

这对我的应用程序来说太糟糕了,但我想我对此无能为力。叹息。

再次感谢您的意见!

最好的,迈克尔。

关于Android:BitmapFactory.decodeByteArray 给出像素化位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2183808/

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