通过seekbar获得二值化的阈值
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.road);
w = bitmap.getWidth();
h = bitmap.getHeight();
pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
imageView = (ImageView) findViewById(R.id.imageView1);
seekBar = (SeekBar) findViewById(R.id.seekBar1);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Toast.makeText(MainActivity.this, thresHold + "",
Toast.LENGTH_SHORT).show();
int[] result_pix = Binary.binaryImage(pix, w, h, thresHold);
Bitmap result = Bitmap.createBitmap(w, h, Config.ARGB_8888);
result.setPixels(result_pix, 0, w, 0, 0, w, h);
imageView.setImageBitmap(result);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
thresHold = progress;
}
});
jni里面是这么写的
JNIEXPORT jintArray JNICALL Java_com_example_binaryimage_Binary_binaryImage(
JNIEnv *env, jclass clz, jintArray buffer, jint width, jint height,
jint threshold) {
jint *cbuf = env->GetIntArrayElements(buffer, JNI_FALSE);
if (cbuf == NULL) {
return 0; /* exception occurred */
}
jint alpha = 0xFF << 24;
for (jint i = 0; i < height; i++) {
for (jint j = 0; j < width; j++) {
// 获得像素的颜色
jint color = cbuf[width * i + j];
jint red = ((color & 0x00FF0000) >> 16);
jint green = ((color & 0x0000FF00) >> 8);
jint blue = color & 0x000000FF;
color = (red + green + blue) / 3;
__android_log_print(ANDROID_LOG_ERROR, "TAG", "pix=%d", color);
if (color <= threshold) {
color = 0;
} else {
color = 255;
}
color = alpha | (color << 16) | (color << 8) | color;
cbuf[width * i + j] = color;
}
}
jint size = width * height;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, cbuf);
env->ReleaseIntArrayElements(buffer, cbuf, 0);
return result;
}
在onStopTrackingTouch函数中每次获得的result_pix 都不一样,但是不知道为什么setImageBitmap以后图像没变化。
如果是第一次运行该程序可以获得正确效果,但如果不退出继续多次滑动seekbar效果不变。不知道为什么?求大神解答