gpt4 book ai didi

Android SetPixels() 解释和示例?

转载 作者:行者123 更新时间:2023-11-29 01:49:39 29 4
gpt4 key购买 nike

我正在尝试在我的 Android 应用程序中将可变位图中的像素区域设置为不同的颜色。不幸的是我无法让 setPixels() 正常工作。我不断收到 ArrayOutOfBoundsExceptions。我认为这可能与步幅有关,但我真的不确定。这是我仍然不明白的唯一参数。我在 setPixels(不是 setPixel)上看到的唯一其他帖子在这里:drawBitmap() and setPixels(): what's the stride?这对我没有帮助。我尝试将步幅设置为 0,作为位图的宽度,作为位图的宽度 - 我试图绘制的区域,但它仍然崩溃。这是我的代码:

public void updateBitmap(byte[] buf, int offset, int x, int y, int width, int height) {
// transform byte[] to int[]
IntBuffer intBuf = ByteBuffer.wrap(buf).asIntBuffer();
int[] intarray = new int[intBuf.remaining()];
intBuf.get(intarray);

int stride = ??????
screenBitmap.setPixels(intarray, offset, stride, x, y, width, height); // crash here

我的位图是可变的,所以我知道这不是问题所在。我还确定我的字节数组已正确转换为整数数组。但我一直收到 ArrayOutOfBoundsExceptions,我不明白为什么。请帮我解决这个问题

编辑 -这是我构造假输入的方法:

int width = 1300;
int height = 700;
byte[] buf = new byte[width * height * 4 * 4]; // adding another * 4 here seems to work... why?
for (int i = 0; i < width * height * 4 * 4; i+=4) {
buf[i] = (byte)255;
buf[i + 1] = 3;
buf[i + 2] = (byte)255;
buf[i + 3] = 3;
}
//(byte[] buf, int offset, int x, int y, int width, int height) - for reference
siv.updateBitmap(buf, 0, 0, 0, width, height);

所以宽度和高度是正确的整数数量(至少应该是)。

EDIT2 - 这是最初创建 screenBitmap 的代码:

public Bitmap createABitmap() {
int w = 1366;
int h = 766;

byte[] buf = new byte[h * w * 4];

for (int i = 0; i < h * w * 4;i+=4) {
buf[i] = (byte)255;
buf[i+1] = (byte)255;
buf[i+2] = 0;
buf[i+3] = 0;
}

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

IntBuffer intBuf = ByteBuffer.wrap(buf).asIntBuffer();
int[] intarray = new int[intBuf.remaining()];
intBuf.get(intarray);

Bitmap bmp = Bitmap.createBitmap(metrics, w, h, itmap.Config.valueOf("ARGB_8888"));
bmp.setPixels(intarray, 0, w, 0, 0, w, h);
return bmp;
}

在这种情况下似乎有效,不确定有什么区别

最佳答案

我认为,stride 是以像素为单位包含的图像宽度。

根据我从文档中得到的信息,该算法应该像这样工作:

public void setPixels (int[] pixels, 
int offset,
int stride,
int x,
int y,
int width,
int height)
for (int rowIndex = 0; rowIndex < height; rowIndex++) {
int rowStart = offset + stride * rowIndex; // row position in pixels
int bitmapY = y + rowIndex; // y position in the bitmap
for (int columnIndex = 0; columnIndex < width; columnIndex++) {
int bitmapX = x + columnIndex; // x position in the bitmap
int pixelsIndex = rowStart + columnIndex; // position in pixels
setPixel(bitmapX, bitmapY, pixels[pixelsIndex]);

}
}
}

至少这就是我对这些参数所做的,因为它允许您将一个 pixels 作为源并裁剪出不同大小的不同图像。如果我错了,请随时纠正算法。

因此,假设您有一张图像,其pixelsWidthpixelsHeight像素 为单位。然后,您想将 pixelsXpixelsY 处的 widthheight 部分复制到 bitmap 在位置 bitmapXbitmapY。这应该是调用:

bitmap.setPixels(
pixelsWidth * pixelsY + pixelsX, // offset
pixelsWidth, // stride
bitmapX, // x
bitmapY, // y
width,
height)

关于Android SetPixels() 解释和示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19019825/

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