图像处理---LoMo
生活随笔
收集整理的這篇文章主要介紹了
图像处理---LoMo
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
所謂Lomo效果無非就是四角變暗,然后加上顏色矩陣變換。
以下是通過c代碼實現的Lomo效果,效果有待優化:
/** LOMO效果*/ jintArray ToLOMO(JNIEnv *env, jobject obj, jintArray srcPixels, jint width,jint height, jfloat factor) {jint* pixels = NULL;pixels = env->GetIntArrayElements(srcPixels, JNI_FALSE);if (pixels == NULL){return srcPixels;}int size = width * height;int result[size];int ratio =width > height ? height * 32768 / width : width * 32768 / height;int cx = width >> 1;int cy = height >> 1;int max = cx * cx + cy * cy;int min = (int) (max * (1 - 0.8f));int diff = max - min;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){int current_color = pixels[i * width + j];int r0 = red(current_color);int g0 = green(current_color);int b0 = blue(current_color);int a0 = alpha(current_color);int value = r0 < 128 ? r0 : 256 - r0;int newR = (value * value * value) / 64 / 256;newR = r0 < 128 ? newR : 255 - newR;value = g0 < 128 ? g0 : 256 - g0;int newG = (value * value) / 128;newG = (g0 < 128 ? newG : 255 - newG);int newB = b0 / 2 + 0x25;/*****************邊緣黑暗**************/int dx = cx - j;int dy = cy - i;if (width > height){dx = (dx * ratio) >> 15;} else{dy = (dy * ratio) >> 15;}int distSq = dx * dx + dy * dy;if (distSq > min){int v = ((max - distSq) << 8) / diff;v *= v;int ri = (int) (newR * v) >> 16;int gi = (int) (newG * v) >> 16;int bi = (int) (newB * v) >> 16;newR = ri > 255 ? 255 : (ri < 0 ? 0 : ri);newG = gi > 255 ? 255 : (gi < 0 ? 0 : gi);newB = bi > 255 ? 255 : (bi < 0 ? 0 : bi);}/**********************邊緣黑暗end*****************/current_color = ARGB(a0, newR, newG, newB);result[i * width + j] = current_color;}}jintArray resultArray = env->NewIntArray(size);env->SetIntArrayRegion(resultArray, 0, size, result);env->ReleaseIntArrayElements(srcPixels, pixels, 0);return resultArray; }以上僅供參考,但是效率不是很高,不過還有一種實現方式,就是利用圖層混合處理算法,此算法等我總結出來釋放demo
總結
以上是生活随笔為你收集整理的图像处理---LoMo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统存储管理之虚拟存储与分页式虚拟存
- 下一篇: DCN论文精读