4,246
社区成员
发帖
与我相关
我的任务
分享
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_wj_demo_ui_activity_DemoBaseImageProcessActivity_mask(JNIEnv *env, jclass obj,jint width,jint height,jintArray srcPixels) {
jint *cbuf;
cbuf = env->GetIntArrayElements(srcPixels,JNI_FALSE);
if(cbuf == NULL)
return NULL;
Mat img(width, height,CV_8UC4,cbuf);
circle(img,Point(width/2,height/2),100,Scalar(255,255,255,0),-1);
int size = width*height;
jint *ptr = img.ptr<jint>(0);
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result,0,size,ptr);
img.release();
env->ReleaseIntArrayElements(srcPixels,cbuf,0);
return result;
}
private void mask(){
mSrcBitmap = ((BitmapDrawable)(mIvSrc.getDrawable())).getBitmap();
mSrcBitmapWidth = mSrcBitmap.getWidth();
mSrcBitmapHeight = mSrcBitmap.getHeight();
mSrcBitmapPixels = new int[mSrcBitmapWidth*mSrcBitmapHeight];
mTmpBitmap = Bitmap.createBitmap(mSrcBitmapWidth,mSrcBitmapHeight,Bitmap.Config.ARGB_8888);
mSrcBitmap.getPixels(mSrcBitmapPixels,0,mSrcBitmapWidth,0,0,mSrcBitmapWidth,mSrcBitmapHeight);
int[] px = mask(mSrcBitmapWidth,mSrcBitmapHeight,mSrcBitmapPixels);
mTmpBitmap.setPixels(px,0,mSrcBitmapWidth,0,0,mSrcBitmapWidth,mSrcBitmapHeight);
mIvSrc.setImageBitmap(mTmpBitmap);
}
private native int[] mask(int width, int height, int[] pixels);
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_wj_demo_ui_activity_DemoBaseImageProcessActivity_mask(JNIEnv *env, jclass obj,jint width,jint height,jintArray srcPixels) {
jint *cbuf;
cbuf = env->GetIntArrayElements(srcPixels,JNI_FALSE);
if(cbuf == NULL)
return NULL;
Mat img(width, height,CV_8UC4,cbuf,width*4); //要手动加入步长,不能使用自动步长,自动步长会设置为最短边*4
//中间圆不全,暂不清楚为什么要以最短边为界限,超过最短边的区域,不会被绘制
circle(img,Point(width/2,height/2),200,Scalar(0,0,0,0),-1);
int size = width*height;
jint *ptr = img.ptr<jint>(0);
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result,0,size,ptr);
img.release();
env->ReleaseIntArrayElements(srcPixels,cbuf,0);
return result;
}
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_wj_demo_ui_activity_DemoBaseImageProcessActivity_mask(JNIEnv *env, jclass obj,jint width,jint height,jintArray srcPixels) {
jint *cbuf;
cbuf = env->GetIntArrayElements(srcPixels,JNI_FALSE);
if(cbuf == NULL)
return NULL;
Mat img(height, width,CV_8UC4,cbuf); //要先传入height,再传入width,步长自动即可
circle(img,Point(width/2,height/2),200,Scalar(0,0,0,0),-1);
int size = width*height;
jint *ptr = img.ptr<jint>(0);
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result,0,size,ptr);
img.release();
env->ReleaseIntArrayElements(srcPixels,cbuf,0);
return result;
}
int cX = width/2;
int cY = height/2;
for(int i=0;i<width;++i)
for(int j=0;j<height;++j){
int dx = cX-i;
int dy = cY-j;
if(abs(dx*dx+dy*dy)<=100*100){
img.at<Vec4b>(i,j)[3]=0;
}
}
int cX = width/2;
int cY = height/2;
uchar* outPtr = img.ptr(0);
for(int i = 0; i < width*height; i ++){
int dx = cX-i%width;
int dy = cY-i/width;
if(abs(dx*dx+dy*dy)<=100*100){
outPtr[4*i+3] = 0;
}
}