当前位置: 代码迷 >> Android >> Android JNI 中通过接收Bit地图对象获取像素,
  详细解决方案

Android JNI 中通过接收Bit地图对象获取像素,

热度:438   发布时间:2016-04-28 05:50:14.0
Android JNI 中通过接收Bitmap对象获取像素,十万火急!!!!!
本帖最后由 liuwanmeng 于 2014-05-01 14:10:46 编辑

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

}

我想知道,直接用上面的这种方式,要怎么获取某个坐标的像素点的值,因为我要进行图像放大,实现插值算法,必须能够通过坐标获得某个像素点的值,求各位大神指教,分不多了。。。
------解决方案--------------------

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

差不多这个意思吧
  相关解决方案