gpt4 book ai didi

android - 处理 Android 的纹理大小限制

转载 作者:可可西里 更新时间:2023-11-01 19:05:44 26 4
gpt4 key购买 nike

我需要在 Android 应用程序上显示较大的图像。现在我正在使用带有源位图的 ImageView。我知道 openGL 有一定的设备无关的限制图像尺寸有多大才能对其进行处理。

有没有任何方式来显示这些图像(固定宽度,不裁剪)而不考虑这个限制,除了将图像拆分为多个 ImageView 元素之外?

谢谢。

2013 年 4 月 1 日更新到目前为止,仍然没有运气,所有建议都是降低图像质量。有人建议可以通过使用 CPU 而不是使用 GPU 进行处理来绕过此限制(尽管可能需要更多时间来处理)。我不明白,难道真的没有办法在不降低图像质量的情况下显示固定宽度的长图吗?我敢打赌,如果有人至少能给我指出正确的方向,我会很高兴。

谢谢大家

最佳答案

您可以使用 BitmapRegionDecoder分解较大的位图(需要 API 级别 10)。我已经编写了一个方法,该方法将利用此类并返回一个可以放置在 ImageView 中的 Drawable:

private static final int MAX_SIZE = 1024;

private Drawable createLargeDrawable(int resId) throws IOException {

InputStream is = getResources().openRawResource(resId);
BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(is, true);

try {
if (brd.getWidth() <= MAX_SIZE && brd.getHeight() <= MAX_SIZE) {
return new BitmapDrawable(getResources(), is);
}

int rowCount = (int) Math.ceil((float) brd.getHeight() / (float) MAX_SIZE);
int colCount = (int) Math.ceil((float) brd.getWidth() / (float) MAX_SIZE);

BitmapDrawable[] drawables = new BitmapDrawable[rowCount * colCount];

for (int i = 0; i < rowCount; i++) {

int top = MAX_SIZE * i;
int bottom = i == rowCount - 1 ? brd.getHeight() : top + MAX_SIZE;

for (int j = 0; j < colCount; j++) {

int left = MAX_SIZE * j;
int right = j == colCount - 1 ? brd.getWidth() : left + MAX_SIZE;

Bitmap b = brd.decodeRegion(new Rect(left, top, right, bottom), null);
BitmapDrawable bd = new BitmapDrawable(getResources(), b);
bd.setGravity(Gravity.TOP | Gravity.LEFT);
drawables[i * colCount + j] = bd;
}
}

LayerDrawable ld = new LayerDrawable(drawables);
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < colCount; j++) {
ld.setLayerInset(i * colCount + j, MAX_SIZE * j, MAX_SIZE * i, 0, 0);
}
}

return ld;
}
finally {
brd.recycle();
}
}

该方法将检查可绘制资源在两个轴上是否小于 MAX_SIZE (1024)。如果是,它只返回可绘制对象。如果不是,它将分解图像并解码图像 block 并将它们放置在 LayerDrawable 中。

我选择 1024 是因为我相信大多数手机至少支持那么大的图像。如果你想找到手机的实际纹理大小限制,你必须通过 OpenGL 做一些时髦的事情,这不是我想深入研究的事情。

我不确定您是如何访问图像的,所以我假设它们在您的可绘制文件夹中。如果不是这种情况,重构该方法以接收您需要的任何参数应该相当容易。

关于android - 处理 Android 的纹理大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15655713/

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