Skip to content

Commit c7c4539

Browse files
committed
项目提交
项目数据提交。
1 parent e27ecf5 commit c7c4539

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1787
-0
lines changed

app/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

app/app.iml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module external.linked.project.path="C:\Users\Rose\Desktop\ImageBlurring\app" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="ImageBlurring" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
3+
<component name="FacetManager">
4+
<facet type="android-gradle" name="Android-Gradle">
5+
<configuration>
6+
<option name="GRADLE_PROJECT_PATH" value=":app" />
7+
</configuration>
8+
</facet>
9+
<facet type="android" name="Android">
10+
<configuration>
11+
<option name="SELECTED_BUILD_VARIANT" value="debug" />
12+
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
13+
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
14+
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
15+
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
16+
<option name="ALLOW_USER_CONFIGURATION" value="false" />
17+
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
18+
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
19+
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
20+
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
21+
</configuration>
22+
</facet>
23+
</component>
24+
<component name="NewModuleRootManager" inherit-compiler-output="false">
25+
<output url="file://$MODULE_DIR$/build/classes/debug" />
26+
<exclude-output />
27+
<content url="file://$MODULE_DIR$">
28+
<sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" generated="true" />
29+
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" generated="true" />
30+
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" generated="true" />
31+
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" generated="true" />
32+
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" type="java-resource" />
33+
<sourceFolder url="file://$MODULE_DIR$/build/source/r/test/debug" isTestSource="true" generated="true" />
34+
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test/debug" isTestSource="true" generated="true" />
35+
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test/debug" isTestSource="true" generated="true" />
36+
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/test/debug" isTestSource="true" generated="true" />
37+
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/test/debug" type="java-test-resource" />
38+
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
39+
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
40+
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
41+
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
42+
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
43+
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
44+
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
45+
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
46+
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
47+
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
48+
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
49+
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
50+
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
51+
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
52+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
53+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
54+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
55+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" isTestSource="true" />
56+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
57+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
58+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
59+
<excludeFolder url="file://$MODULE_DIR$/build/apk" />
60+
<excludeFolder url="file://$MODULE_DIR$/build/assets" />
61+
<excludeFolder url="file://$MODULE_DIR$/build/bundles" />
62+
<excludeFolder url="file://$MODULE_DIR$/build/classes" />
63+
<excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
64+
<excludeFolder url="file://$MODULE_DIR$/build/incremental" />
65+
<excludeFolder url="file://$MODULE_DIR$/build/libs" />
66+
<excludeFolder url="file://$MODULE_DIR$/build/manifests" />
67+
<excludeFolder url="file://$MODULE_DIR$/build/res" />
68+
<excludeFolder url="file://$MODULE_DIR$/build/symbols" />
69+
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
70+
</content>
71+
<orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" />
72+
<orderEntry type="sourceFolder" forTests="false" />
73+
<orderEntry type="library" exported="" name="support-v4-19.0.1" level="project" />
74+
</component>
75+
</module>
76+

app/build.gradle

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
apply plugin: 'android'
2+
3+
android {
4+
compileSdkVersion 19
5+
buildToolsVersion "19.0.0"
6+
7+
defaultConfig {
8+
minSdkVersion 16
9+
targetSdkVersion 19
10+
versionCode 1
11+
versionName "1.0"
12+
}
13+
buildTypes {
14+
release {
15+
runProguard false
16+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
17+
}
18+
}
19+
}
20+
21+
dependencies {
22+
compile fileTree(dir: 'libs', include: ['*.jar'])
23+
compile "com.android.support:support-v4:19.0.+"
24+
}
25+

app/jni/Android.mk

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
LOCAL_PATH := $(call my-dir)
2+
3+
include $(CLEAR_VARS)
4+
5+
LOCAL_MODULE := JNI_ImageBlur
6+
LOCAL_SRC_FILES := com_accumulation_imageblurring_app_jni_ImageBlur.cpp
7+
LOCAL_LDLIBS := -llog -ljnigraphics
8+
9+
include $(BUILD_SHARED_LIBRARY)

app/jni/Application.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# The ARMv7 is significanly faster due to the use of the hardware FPU
2+
APP_ABI := armeabi armeabi-v7a
3+
APP_PLATFORM := android-19

app/jni/ImageBlur.cpp

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
/*************************************************
2+
Copyright: Copyright QIUJUER 2013.
3+
Author: Qiujuer
4+
Date: 2014-04-18
5+
Description:实现图片模糊处理
6+
**************************************************/
7+
#include<malloc.h>
8+
9+
#define ABS(a) ((a)<(0)?(-a):(a))
10+
#define MAX(a,b) ((a)>(b)?(a):(b))
11+
#define MIN(a,b) ((a)<(b)?(a):(b))
12+
13+
/*************************************************
14+
Function: StackBlur(堆栈模糊)
15+
Description: 使用堆栈方式进行图片像素模糊处理
16+
Calls: malloc
17+
Table Accessed: NULL
18+
Table Updated: NULL
19+
Input: 像素点集合,图片宽,图片高,模糊半径
20+
Output: 返回模糊后的像素点集合
21+
Return: 返回模糊后的像素点集合
22+
Others: NULL
23+
*************************************************/
24+
static int* StackBlur(int* pix, int w, int h, int radius) {
25+
int wm = w - 1;
26+
int hm = h - 1;
27+
int wh = w * h;
28+
int div = radius + radius + 1;
29+
30+
int *r = (int *)malloc(wh * sizeof(int));
31+
int *g = (int *)malloc(wh * sizeof(int));
32+
int *b = (int *)malloc(wh * sizeof(int));
33+
int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
34+
35+
int *vmin = (int *)malloc(MAX(w,h) * sizeof(int));
36+
37+
int divsum = (div + 1) >> 1;
38+
divsum *= divsum;
39+
int *dv = (int *)malloc(256 * divsum * sizeof(int));
40+
for (i = 0; i < 256 * divsum; i++) {
41+
dv[i] = (i / divsum);
42+
}
43+
44+
yw = yi = 0;
45+
46+
int(*stack)[3] = (int(*)[3])malloc(div * 3 * sizeof(int));
47+
int stackpointer;
48+
int stackstart;
49+
int *sir;
50+
int rbs;
51+
int r1 = radius + 1;
52+
int routsum, goutsum, boutsum;
53+
int rinsum, ginsum, binsum;
54+
55+
for (y = 0; y < h; y++) {
56+
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
57+
for (i = -radius; i <= radius; i++) {
58+
p = pix[yi + (MIN(wm, MAX(i, 0)))];
59+
sir = stack[i + radius];
60+
sir[0] = (p & 0xff0000) >> 16;
61+
sir[1] = (p & 0x00ff00) >> 8;
62+
sir[2] = (p & 0x0000ff);
63+
64+
rbs = r1 - ABS(i);
65+
rsum += sir[0] * rbs;
66+
gsum += sir[1] * rbs;
67+
bsum += sir[2] * rbs;
68+
if (i > 0) {
69+
rinsum += sir[0];
70+
ginsum += sir[1];
71+
binsum += sir[2];
72+
}
73+
else {
74+
routsum += sir[0];
75+
goutsum += sir[1];
76+
boutsum += sir[2];
77+
}
78+
}
79+
stackpointer = radius;
80+
81+
for (x = 0; x < w; x++) {
82+
83+
r[yi] = dv[rsum];
84+
g[yi] = dv[gsum];
85+
b[yi] = dv[bsum];
86+
87+
rsum -= routsum;
88+
gsum -= goutsum;
89+
bsum -= boutsum;
90+
91+
stackstart = stackpointer - radius + div;
92+
sir = stack[stackstart % div];
93+
94+
routsum -= sir[0];
95+
goutsum -= sir[1];
96+
boutsum -= sir[2];
97+
98+
if (y == 0) {
99+
vmin[x] = MIN(x + radius + 1, wm);
100+
}
101+
p = pix[yw + vmin[x]];
102+
103+
sir[0] = (p & 0xff0000) >> 16;
104+
sir[1] = (p & 0x00ff00) >> 8;
105+
sir[2] = (p & 0x0000ff);
106+
107+
rinsum += sir[0];
108+
ginsum += sir[1];
109+
binsum += sir[2];
110+
111+
rsum += rinsum;
112+
gsum += ginsum;
113+
bsum += binsum;
114+
115+
stackpointer = (stackpointer + 1) % div;
116+
sir = stack[(stackpointer) % div];
117+
118+
routsum += sir[0];
119+
goutsum += sir[1];
120+
boutsum += sir[2];
121+
122+
rinsum -= sir[0];
123+
ginsum -= sir[1];
124+
binsum -= sir[2];
125+
126+
yi++;
127+
}
128+
yw += w;
129+
}
130+
for (x = 0; x < w; x++) {
131+
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
132+
yp = -radius * w;
133+
for (i = -radius; i <= radius; i++) {
134+
yi = MAX(0, yp) + x;
135+
136+
sir = stack[i + radius];
137+
138+
sir[0] = r[yi];
139+
sir[1] = g[yi];
140+
sir[2] = b[yi];
141+
142+
rbs = r1 - ABS(i);
143+
144+
rsum += r[yi] * rbs;
145+
gsum += g[yi] * rbs;
146+
bsum += b[yi] * rbs;
147+
148+
if (i > 0) {
149+
rinsum += sir[0];
150+
ginsum += sir[1];
151+
binsum += sir[2];
152+
}
153+
else {
154+
routsum += sir[0];
155+
goutsum += sir[1];
156+
boutsum += sir[2];
157+
}
158+
159+
if (i < hm) {
160+
yp += w;
161+
}
162+
}
163+
yi = x;
164+
stackpointer = radius;
165+
for (y = 0; y < h; y++) {
166+
// Preserve alpha channel: ( 0xff000000 & pix[yi] )
167+
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
168+
169+
rsum -= routsum;
170+
gsum -= goutsum;
171+
bsum -= boutsum;
172+
173+
stackstart = stackpointer - radius + div;
174+
sir = stack[stackstart % div];
175+
176+
routsum -= sir[0];
177+
goutsum -= sir[1];
178+
boutsum -= sir[2];
179+
180+
if (x == 0) {
181+
vmin[y] = MIN(y + r1, hm) * w;
182+
}
183+
p = x + vmin[y];
184+
185+
sir[0] = r[p];
186+
sir[1] = g[p];
187+
sir[2] = b[p];
188+
189+
rinsum += sir[0];
190+
ginsum += sir[1];
191+
binsum += sir[2];
192+
193+
rsum += rinsum;
194+
gsum += ginsum;
195+
bsum += binsum;
196+
197+
stackpointer = (stackpointer + 1) % div;
198+
sir = stack[stackpointer];
199+
200+
routsum += sir[0];
201+
goutsum += sir[1];
202+
boutsum += sir[2];
203+
204+
rinsum -= sir[0];
205+
ginsum -= sir[1];
206+
binsum -= sir[2];
207+
208+
yi += w;
209+
}
210+
}
211+
212+
free(r);
213+
free(g);
214+
free(b);
215+
free(vmin);
216+
free(dv);
217+
free(stack);
218+
return(pix);
219+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <com_accumulation_imageblurring_app_jni_ImageBlur.h>
2+
#include <ImageBlur.cpp>
3+
#include <android/log.h>
4+
#include <android/bitmap.h>
5+
6+
7+
JNIEXPORT jintArray JNICALL Java_com_accumulation_imageblurring_app_jni_ImageBlur_blurIntArray
8+
(JNIEnv *env, jobject obj, jintArray arrIn, jint w, jint h, jint r)
9+
{
10+
jint *pix;
11+
pix = env->GetIntArrayElements(arrIn, NULL);
12+
if (pix == NULL)
13+
return NULL;
14+
//Start
15+
pix = StackBlur(pix, w, h, r);
16+
//End
17+
int size = w * h;
18+
jintArray result = env->NewIntArray(size);
19+
env->SetIntArrayRegion(result, 0, size, pix);
20+
env->ReleaseIntArrayElements(arrIn, pix, 0);
21+
return result;
22+
}
23+
24+
JNIEXPORT void JNICALL Java_com_accumulation_imageblurring_app_jni_ImageBlur_blurBitMap
25+
(JNIEnv *env, jobject obj, jobject bitmapIn, jint r)
26+
{
27+
AndroidBitmapInfo infoIn;
28+
void* pixelsIn;
29+
int ret;
30+
31+
// Get image info
32+
if ((ret = AndroidBitmap_getInfo(env, bitmapIn, &infoIn)) < 0)
33+
return;
34+
// Check image
35+
if (infoIn.format != ANDROID_BITMAP_FORMAT_RGBA_8888)
36+
return;
37+
// Lock all images
38+
if ((ret = AndroidBitmap_lockPixels(env, bitmapIn, &pixelsIn)) < 0) {
39+
//AndroidBitmap_lockPixels failed!
40+
}
41+
//height width
42+
int h = infoIn.height;
43+
int w = infoIn.width;
44+
45+
//Start
46+
pixelsIn = StackBlur((int*)pixelsIn, w, h, r);
47+
//End
48+
49+
// Unlocks everything
50+
AndroidBitmap_unlockPixels(env, bitmapIn);
51+
}

0 commit comments

Comments
 (0)