NDK处理图片——拼接长图

来源:互联网 发布:自动刷弹幕软件 编辑:程序博客网 时间:2024/06/06 13:48

        现在流行把多张图片拼接成长图,做成相册的形式,这样看起来更加酷。实现功能并不难,简单说下自己的实现思路:先对所有图片预处理,进行图片压缩,并且把每张图片的宽高剪裁成一致;然后将每张图片像素的数组按照顺序写到新的数组里,这样就完成图片拼接了;最后把新数组转成Bitmap在界面显示。

        先看下两张图片拼接的效果:


        native层实现方法如下:

jintArrayJava_com_frank_image_ImageUtil_jointPicture(JNIEnv *env, jobject, jintArray pixels, jint width, jint height,                                            jintArray addPixels, jint addWidth, jint addHeight){    //像素数组拷贝到native层    jint *pixel = env->GetIntArrayElements(pixels, false);    jint *addPixel = env->GetIntArrayElements(addPixels, false);    //这里假定图片宽度相同    int size = width * (height+addHeight);    jint *newPixel = new jint[size];    int x, y;    for(x=0; x < width; x++){        for(y=0; y < height; y++){            newPixel[y*width + x] = pixel[y*width + x];        }    }    for(x=0; x < width; x++){        for(y=0; y < addHeight; y++){            newPixel[(y+height)*width + x] = addPixel[y*addWidth + x];        }    }    jintArray newPixels = env->NewIntArray(size);    env->SetIntArrayRegion(newPixels, 0, size, newPixel);    env->ReleaseIntArrayElements(pixels, pixel, 0);    env->ReleaseIntArrayElements(addPixels, addPixel, 0);    return newPixels;}
        Java层调用native方法时,需要传参:原图像素数组、图片宽度、图片高度、追加图片像素数组、以及宽度高度。处理完毕,得到拼接成长图的数组,根据该数组以及宽度高度创建新Bitmap:

    /**     * 使用NDK拼接图片     * @param bitmap bitmap     * @param imageView imageView     * @param addBitmap addBitmap     */    private void ndkJointPicture(Bitmap bitmap, ImageView imageView, Bitmap addBitmap){        int width = bitmap.getWidth();        int height = bitmap.getHeight();        int[] pixels = new int[width * height];        //获取bitmap的所有pixel像素点        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);        int addWidth = addBitmap.getWidth();        int addHeight = addBitmap.getHeight();        int[] addPixel = new int[addWidth * addHeight];        addBitmap.getPixels(addPixel, 0, addWidth, 0, 0, addWidth, addHeight);        //ndk处理像素点数组        int[] newPixels = ImageUtil.jointPicture(pixels, width, height, addPixel, addWidth, addHeight);        Bitmap ndkBitmap = Bitmap.createBitmap(width, height+addHeight, Bitmap.Config.RGB_565);        //重新设置bitmap的所有pixel像素点        ndkBitmap.setPixels(newPixels, 0, width, 0, 0, width, height+addHeight);        imageView.setImageBitmap(ndkBitmap);    }
        jni方法这样传参看起来太费劲了,每张图片对应一个像素数组、宽度、高度,有没有更好的方法呢?嗯,Google开发人员已经为我们考虑到了,添加<android/bitmap.h>的头文件依赖,支持直接把Bitmap作为jobject传参进去,直接操作Bitmap像素。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微云端 手机云端 客户云端 夜云端 云端浏览器 郑云端 智能云端 云端资料柜 飞上云端 海云端 云端三国杀 七彩云端 漫步云端路 夜云端御天神皇 御天神皇夜云端 师父如花隔云端 师傅如花隔云端 云端筑梦师多少钱 云阳龙缸云端廊桥 宠上云端机长追妻100式 云端之奕装备合成 qq同步助手云端 在云端闲人有闲 宠上云端机长追妻100式宁南絮 庄周云端筑梦师 庄周云端筑梦师2019返场时间 漫步云端作品 师父如花隔云端全文免费阅读 手机云端下载 云端下载安装 云端是什么软件 下载云端软件平台 云端软件平台 云端是什么意思 云端软件是什么 qq云端在哪里 云端存储软件 云端骑士下载 云端备份恢复 云端备份通讯录 qq云端通讯录