Android JNI 中通过接收Bitmap对象获取像素,十万火急!!!!!

liuwanmeng 2014-05-01 02:04:55

typedef struct {
uint8_t alpha;
uint8_t red;
uint8_t green;
uint8_t blue;
} argb;

//参数srcbit 和 dstbit都是从android端传过来的Bitmap对象。下面的这个函数可以实现图片的灰度化处理
//dstbit在android端已经给其分配了空间,但里面没有像素值,灰度化处理后的像素值保存在dstbit里面,然后供android端调用
//AndroidBitmap_getInfo()和AndroidBitmap_lockPixels()都是bitmap.h这个头文件中提供的函数
JNIEXPORT void JNICALL Java_com_example_imagehandle_MainActivity_expand
(JNIEnv * env, jobject obj, jobject srcbit, jobject dstbit)
{
AndroidBitmapInfo srcinfo;
void* srcpixels;
AndroidBitmapInfo dstinfo;
void* dstpixels;
int ret;
int y;
int x;

if ((ret = AndroidBitmap_getInfo(env, srcbit, &srcinfo)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}

if ((ret = AndroidBitmap_getInfo(env, dstbit, &dstinfo)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}

if (srcinfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
LOGE("Source Bitmap format is not RGBA_8888 !");
return;
}

if (dstinfo.format != ANDROID_BITMAP_FORMAT_A_8) {
LOGE("destination Bitmap format is not alpha_8 !");
return;
}

if ((ret = AndroidBitmap_lockPixels(env, srcbit, &srcpixels)) < 0) {
LOGE("Src Bitmap LockPixels Failed ret=%d!", ret);
return;
}

if ((ret = AndroidBitmap_lockPixels(env, dstbit, &dstpixels)) < 0) {
LOGE("Dst Bitmap LockPixels Failed ret=%d!", ret);
return;
}

for (y = 0; y < srcinfo.height; y++) {
argb * line = (argb *) srcpixels;
uint8_t * dstline = (uint8_t *) dstpixels;
for (x = 0; x < srcinfo.width; x++) {
dstline[x] = 0.3 * line[x].red + 0.59 * line[x].green
+ 0.11 * line[x].blue;
}

srcpixels = (char *) srcpixels + srcinfo.stride;
dstpixels = (char *) dstpixels + dstinfo.stride;
}

AndroidBitmap_unlockPixels(env, srcbit);
AndroidBitmap_unlockPixels(env, dstbit);

}

我想知道,直接用上面的这种方式,要怎么获取某个坐标的像素点的值,因为我要进行图像放大,实现插值算法,必须能够通过坐标获得某个像素点的值,求各位大神指教,分不多了。。。
...全文
407 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Darcy杨 2014-05-02
  • 打赏
  • 举报
回复

int x = 0, y = 0, ps = 4;
unsigned char *pixels = xxxxxxx;// AndroidBitmap_lockPixels
unsigned char *pixel = NULL;
for (y = 0; y < height; ++y) {
    for (x = 0; x < width; ++x) {
        pixel = pixels + y * width * ps + x * ps;
    }
}
差不多这个意思吧
liuwanmeng 2014-05-01
  • 打赏
  • 举报
回复
引用 1 楼 youngc527 的回复:
AndroidBitmap_lockPixels之后,srcpixels就是像素值,每个像素的大小跟format有关,ARGB_8888格式的,每个pixel是int32大小
那我想根据XY坐标获取srcpixels中某个像素值该怎么做?我希望能像操作二维数组那样去获得像素值
Darcy杨 2014-05-01
  • 打赏
  • 举报
回复
AndroidBitmap_lockPixels之后,srcpixels就是像素值,每个像素的大小跟format有关,ARGB_8888格式的,每个pixel是int32大小

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧