勇敢地追 2016-11-17 11:16 采纳率: 66.7%
浏览 1030
已采纳

jni多次将一张图片二值化却获得相同的效果

通过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效果不变。不知道为什么?求大神解答

  • 写回答

1条回答 默认 最新

  • 勇敢地追 2016-11-18 02:57
    关注

    我自己解决啦。我发现

     int[] result_pix = Binary.binaryImage(pix, w, h, thresHold);
    

    这代码不仅会改变result_pix,pix也会变,所以只要这样

     @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    textView.setText("阈值是:" + thresHold);
                    bitmap.getPixels(pix, 0, w, 0, 0, w, h);
                    // binaryImage会把pix替换掉
                    int[] result_pix = Binary.binaryImage(pix, w, h, thresHold);
                    result.setPixels(result_pix, 0, w, 0, 0, w, h);
                    imageView.setImageBitmap(result);
                }
    

    至于为啥这么做我不知道了。求大神说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 如何提取csv文件中需要的列,将其整合为一篇完整文档,并进行jieba分词(语言-python)
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置