# 文件与Bitmap间的方法
1. 从文件载入Bitmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<code>/**</code>
<code> </code><code>* @brief 从文件载入Bitmap</code>
<code> </code><code>* @param path 图片路径</code>
<code> </code><code>* @param opts 选项</code>
<code> </code><code>* @return Bitmap</code>
<code> </code><code>*/</code>
<code>public</code> <code>Bitmap loadFromFile(String path, Options opts) {</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>File f = </code><code>new</code> <code>File(path);</code>
<code> </code><code>if</code> <code>(!f.exists() || f.isDirectory()) {</code>
<code> </code><code>return</code> <code>null</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>Bitmap bm = BitmapFactory.decodeFile(path, opts);</code>
<code> </code><code>return</code> <code>bm;</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e) {</code>
<code> </code><code>return</code> <code>null</code><code>;</code>
<code> </code><code>}</code>
<code>}</code>
<code>public</code> <code>Bitmap loadFromFile(String path) {</code>
<code> </code><code>return</code> <code>loadFromFile(path, </code><code>null</code><code>);</code>
2. 载入取样的Bitmap
原宽度和高度的各1/sampleSize大小。
显示图片文件时一般都是取样图,否则很容易outofmemory。
<code> </code><code>* @brief 从文件载入采样后的Bitmap</code>
<code> </code><code>* @see android.graphics.BitmapFactory.Options#inSampleSize</code>
<code>public</code> <code>Bitmap loadSampleSize(String path, </code><code>int</code> <code>sampleSize) {</code>
<code> </code><code>Options opts = </code><code>new</code> <code>Options();</code>
<code> </code><code>opts.inSampleSize = sampleSize;</code>
<code> </code><code>return</code> <code>loadFromFile(path, opts);</code>
3. 载入Bitmap边框
其返回Bitmap为null,但Options.outxxx会被填充值。包括outHeight, outWidth, outMimeType。
只读取其高宽信息的话,就不需要读取全部Bitmap了。可结合上个方法,获取倍数缩小的样图。
<code> </code><code>* @brief 从文件载入只获边框的Bitmap</code>
<code> </code><code>* @see android.graphics.BitmapFactory.Options#inJustDecodeBounds</code>
<code>public</code> <code>Options loadJustDecodeBounds(String path) {</code>
<code> </code><code>opts.inJustDecodeBounds = </code><code>true</code><code>;</code>
<code> </code><code>loadFromFile(path, opts);</code>
<code> </code><code>return</code> <code>opts;</code>
4. 保存Bitmap至文件
<code> </code><code>* @brief 保存Bitmap至文件</code>
<code> </code><code>* @param bm Bitmap</code>
<code> </code><code>* @return 成功与否</code>
<code>public</code> <code>boolean</code> <code>compressBitmap(Bitmap bm, String path) {</code>
<code> </code><code>FileOutputStream out = </code><code>null</code><code>;</code>
<code> </code><code>out = </code><code>new</code> <code>FileOutputStream(path);</code>
<code> </code><code>bm.compress(Bitmap.CompressFormat.JPEG, </code><code>100</code><code>, out);</code>
<code> </code><code>out.flush();</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>} </code><code>finally</code> <code>{</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>if</code> <code>(out != </code><code>null</code><code>) {</code>
<code> </code><code>out.close();</code>
<code> </code><code>}</code>
<code> </code><code>} </code><code>catch</code> <code>(IOException e) {</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
5. 读取图片方向信息
Bitmap图片的方法==!!!
27
28
29
<code> </code><code>* @brief 读取图片方向信息</code>
<code> </code><code>* @return 角度</code>
<code>public</code> <code>int</code> <code>readPhotoDegree(String path) {</code>
<code> </code><code>int</code> <code>degree = </code><code>0</code><code>;</code>
<code> </code><code>ExifInterface exifInterface = </code><code>new</code> <code>ExifInterface(path);</code>
<code> </code><code>int</code> <code>orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,</code>
<code> </code><code>ExifInterface.ORIENTATION_NORMAL);</code>
<code> </code><code>switch</code> <code>(orientation) {</code>
<code> </code><code>case</code> <code>ExifInterface.ORIENTATION_ROTATE_90:</code>
<code> </code><code>degree = </code><code>90</code><code>;</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>case</code> <code>ExifInterface.ORIENTATION_ROTATE_180:</code>
<code> </code><code>degree = </code><code>180</code><code>;</code>
<code> </code><code>case</code> <code>ExifInterface.ORIENTATION_ROTATE_270:</code>
<code> </code><code>degree = </code><code>270</code><code>;</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>degree = </code><code>0</code><code>;</code>
<code> </code><code>} </code><code>catch</code> <code>(IOException e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>return</code> <code>degree;</code>
# 处理Bitmap的方法
1. 生成缩略图
<code>public</code> <code>Bitmap extractThumbnail(Bitmap src, </code><code>int</code> <code>width, </code><code>int</code> <code>height) {</code>
<code> </code><code>return</code> <code>ThumbnailUtils.extractThumbnail(src, width, height,</code>
<code> </code><code>ThumbnailUtils.OPTIONS_RECYCLE_INPUT);</code>
2. 缩放
<code> </code><code>* @brief 缩放Bitmap,自动回收原Bitmap</code>
<code> </code><code>* @see ImageUtil#scaleBitmap(Bitmap, int, int, boolean)</code>
<code>public</code> <code>Bitmap scaleBitmap(Bitmap src, </code><code>int</code> <code>dstWidth, </code><code>int</code> <code>dstHeight) {</code>
<code> </code><code>return</code> <code>scaleBitmap(src, dstWidth, dstHeight, </code><code>true</code><code>);</code>
<code> </code><code>* @brief 缩放Bitmap</code>
<code> </code><code>* @param src 源Bitmap</code>
<code> </code><code>* @param dstWidth 目标宽度</code>
<code> </code><code>* @param dstHeight 目标高度</code>
<code> </code><code>* @param isRecycle 是否回收原图像</code>
<code>public</code> <code>Bitmap scaleBitmap(Bitmap src, </code><code>int</code> <code>dstWidth, </code><code>int</code> <code>dstHeight, </code><code>boolean</code> <code>isRecycle) {</code>
<code> </code><code>if</code> <code>(src.getWidth() == dstWidth && src.getHeight() == dstHeight) {</code>
<code> </code><code>return</code> <code>src;</code>
<code> </code><code>Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, </code><code>false</code><code>);</code>
<code> </code><code>if</code> <code>(isRecycle && dst != src) {</code>
<code> </code><code>src.recycle();</code>
<code> </code><code>return</code> <code>dst;</code>
3. 裁剪
<code> </code><code>* @brief 裁剪Bitmap,自动回收原Bitmap</code>
<code> </code><code>* @see ImageUtil#cropBitmap(Bitmap, int, int, int, int, boolean)</code>
<code>public</code> <code>Bitmap cropBitmap(Bitmap src, </code><code>int</code> <code>x, </code><code>int</code> <code>y, </code><code>int</code> <code>width, </code><code>int</code> <code>height) {</code>
<code> </code><code>return</code> <code>cropBitmap(src, x, y, width, height, </code><code>true</code><code>);</code>
<code> </code><code>* @brief 裁剪Bitmap</code>
<code> </code><code>* @param x 开始x坐标</code>
<code> </code><code>* @param y 开始y坐标</code>
<code> </code><code>* @param width 截取宽度</code>
<code> </code><code>* @param height 截取高度</code>
<code>public</code> <code>Bitmap cropBitmap(Bitmap src, </code><code>int</code> <code>x, </code><code>int</code> <code>y, </code><code>int</code> <code>width, </code><code>int</code> <code>height, </code><code>boolean</code> <code>isRecycle) {</code>
<code> </code><code>if</code> <code>(x == </code><code>0</code> <code>&& y == </code><code>0</code> <code>&& width == src.getWidth() && height == src.getHeight()) {</code>
<code> </code><code>Bitmap dst = Bitmap.createBitmap(src, x, y, width, height);</code>
4. 旋转
<code> </code><code>* @brief 旋转Bitmap,自动回收原Bitmap</code>
<code> </code><code>* @see ImageUtil#rotateBitmap(Bitmap, int, boolean)</code>
<code>public</code> <code>Bitmap rotateBitmap(Bitmap src, </code><code>int</code> <code>degree) {</code>
<code> </code><code>return</code> <code>rotateBitmap(src, degree, </code><code>true</code><code>);</code>
<code> </code><code>* @brief 旋转Bitmap,顺时针</code>
<code> </code><code>* @param degree 旋转角度</code>
<code>public</code> <code>Bitmap rotateBitmap(Bitmap src, </code><code>int</code> <code>degree, </code><code>boolean</code> <code>isRecycle) {</code>
<code> </code><code>if</code> <code>(degree % </code><code>360</code> <code>== </code><code>0</code><code>) {</code>
<code> </code><code>int</code> <code>w = src.getWidth();</code>
<code> </code><code>int</code> <code>h = src.getHeight();</code>
<code> </code><code>Matrix matrix = </code><code>new</code> <code>Matrix();</code>
<code> </code><code>matrix.postRotate(degree);</code>
<code> </code><code>Bitmap dst = Bitmap.createBitmap(src, </code><code>0</code><code>, </code><code>0</code><code>, w, h, matrix, </code><code>true</code><code>);</code>
# OpenCV处理Bitmap的方法
除了导入OpenCV的jar包,我们只需要libopencv_java.so,就可以下做进行操作了。
1. 常规性的init
<code>static</code> <code>{</code>
<code> </code><code>if</code> <code>(!OpenCVLoader.initDebug()) {</code>
<code> </code><code>Log.e(TAG, </code><code>"OpenCVLoader initDebug failed."</code><code>);</code>
2. 常规性处理流程
bmp -> mat -> 接口处理 -> mat_new -> bmp_new。
<code>private</code> <code>interface</code> <code>IHandler {</code>
<code> </code><code>Mat proc(Mat mat_bmp);</code>
<code>private</code> <code>Bitmap handle(Bitmap src, IHandler handler) {</code>
<code> </code><code>Mat mat_bmp = </code><code>new</code> <code>Mat(src.getHeight(), src.getWidth(), CvType.CV_8UC4);</code>
<code> </code><code>Utils.bitmapToMat(src, mat_bmp, </code><code>false</code><code>); </code><code>// Bitmap->Mat</code>
<code> </code><code>Mat mat_new = handler.proc(mat_bmp); </code><code>// handle mat</code>
<code> </code><code>Bitmap bmp_new = Bitmap.createBitmap(mat_new.cols(), mat_new.rows(),</code>
<code> </code><code>Bitmap.Config.ARGB_8888);</code>
<code> </code><code>Utils.matToBitmap(mat_new, bmp_new, </code><code>false</code><code>); </code><code>// Mat->Bitmap</code>
<code> </code><code>src.recycle();</code>
<code> </code><code>return</code> <code>bmp_new;</code>
3. 缩放
<code>public</code> <code>Bitmap scaleBitmap2(Bitmap src, </code><code>final</code> <code>int</code> <code>dstWidth, </code><code>final</code> <code>int</code> <code>dstHeight) {</code>
<code> </code><code>return</code> <code>handle(src, </code><code>new</code> <code>IHandler() {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>Mat proc(Mat mat_bmp) {</code>
<code> </code><code>Mat mat_new = </code><code>new</code> <code>Mat();</code>
<code> </code><code>Imgproc.resize(mat_bmp, mat_new, </code><code>new</code> <code>Size(dstWidth, dstHeight));</code>
<code> </code><code>return</code> <code>mat_new;</code>
<code> </code><code>});</code>
4. 裁剪
<code>public</code> <code>Bitmap cropBitmap2(Bitmap src, </code><code>final</code> <code>int</code> <code>x, </code><code>final</code> <code>int</code> <code>y, </code><code>final</code> <code>int</code> <code>width,</code>
<code> </code><code>final</code> <code>int</code> <code>height) {</code>
<code> </code><code>if</code> <code>(x + width > src.getWidth()) {</code>
<code> </code><code>throw</code> <code>new</code> <code>IllegalArgumentException(</code><code>"x + width must be <= bitmap.width()"</code><code>);</code>
<code> </code><code>if</code> <code>(y + height > src.getHeight()) {</code>
<code> </code><code>throw</code> <code>new</code> <code>IllegalArgumentException(</code><code>"y + height must be <= bitmap.height()"</code><code>);</code>
<code> </code><code>Rect roi = </code><code>new</code> <code>Rect(x, y, width, height);</code>
<code> </code><code>Mat mat_new = </code><code>new</code> <code>Mat(mat_bmp, roi);</code>
5. 旋转
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<code> </code><code>* @brief 旋转Bitmap,逆时针</code>
<code> </code><code>* @see <a href="http://stackoverflow.com/questions/12852578/image-rotation-with-opencv-in-android-cuts-off-the-edges-of-an-image">More</a></code>
<code>public</code> <code>Bitmap rotateBitmap2(Bitmap src, </code><code>final</code> <code>int</code> <code>degree) {</code>
<code> </code><code>// 计算旋转后图像的宽高</code>
<code> </code><code>double</code> <code>radians = Math.toRadians(degree);</code>
<code> </code><code>double</code> <code>sin = Math.abs(Math.sin(radians));</code>
<code> </code><code>double</code> <code>cos = Math.abs(Math.cos(radians));</code>
<code> </code><code>int</code> <code>width = mat_bmp.width();</code>
<code> </code><code>int</code> <code>height = mat_bmp.height();</code>
<code> </code><code>int</code> <code>newWidth = (</code><code>int</code><code>) (width * cos + height * sin);</code>
<code> </code><code>int</code> <code>newHeight = (</code><code>int</code><code>) (width * sin + height * cos);</code>
<code> </code><code>// 能把原图像和旋转后图像同时放入的外框</code>
<code> </code><code>int</code> <code>frameWidth = Math.max(width, newWidth);</code>
<code> </code><code>int</code> <code>frameHeight = Math.max(height, newHeight);</code>
<code> </code><code>Size frameSize = </code><code>new</code> <code>Size(frameWidth, frameHeight);</code>
<code> </code><code>Mat mat_frame = </code><code>new</code> <code>Mat(frameSize, mat_bmp.type());</code>
<code> </code><code>// 将原图像copy进外框</code>
<code> </code><code>int</code> <code>offsetX = (frameWidth - width) / </code><code>2</code><code>;</code>
<code> </code><code>int</code> <code>offsetY = (frameHeight - height) / </code><code>2</code><code>;</code>
<code> </code><code>Mat mat_frame_submat = mat_frame.submat(offsetY, offsetY + height, offsetX, offsetX</code>
<code> </code><code>+ width);</code>
<code> </code><code>mat_bmp.copyTo(mat_frame_submat);</code>
<code> </code><code>// 旋转外框</code>
<code> </code><code>Point center = </code><code>new</code> <code>Point(frameWidth / </code><code>2</code><code>, frameHeight / </code><code>2</code><code>);</code>
<code> </code><code>Mat mat_rot = Imgproc.getRotationMatrix2D(center, degree, </code><code>1.0</code><code>);</code>
<code> </code><code>Mat mat_res = </code><code>new</code> <code>Mat(); </code><code>// result</code>
<code> </code><code>Imgproc.warpAffine(mat_frame, mat_res, mat_rot, frameSize, Imgproc.INTER_LINEAR,</code>
<code> </code><code>Imgproc.BORDER_CONSTANT, Scalar.all(</code><code>0</code><code>));</code>
<code> </code><code>// 从旋转后的外框获取新图像</code>
<code> </code><code>offsetX = (frameWidth - newWidth) / </code><code>2</code><code>;</code>
<code> </code><code>offsetY = (frameHeight - newHeight) / </code><code>2</code><code>;</code>
<code> </code><code>Mat mat_res_submat = mat_res.submat(offsetY, offsetY + newHeight, offsetX, offsetX</code>
<code> </code><code>+ newWidth);</code>
<code> </code><code>return</code> <code>mat_res_submat;</code>
6. Bitmap效果器
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<code> </code><code>* @brief Bitmap效果器</code>
<code> </code><code>* @author join</code>
<code>public</code> <code>static</code> <code>class</code> <code>Effector {</code>
<code> </code><code>private</code> <code>Config config;</code>
<code> </code><code>private</code> <code>Mat mat;</code>
<code> </code><code>private</code> <code>boolean</code> <code>isGray;</code>
<code> </code><code>private</code> <code>Mat mSepiaKernel;</code>
<code> </code><code>/**</code>
<code> </code><code>* @brief 构造函数</code>
<code> </code><code>* @param bmp 源Bitmap</code>
<code> </code><code>* @param config 'ARGB_8888' or 'RGB_565'</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>Effector(Bitmap bmp, Config config) {</code>
<code> </code><code>Mat mat_bmp = </code><code>new</code> <code>Mat(bmp.getHeight(), bmp.getWidth(), CvType.CV_8UC4);</code>
<code> </code><code>Utils.bitmapToMat(bmp, mat_bmp, </code><code>false</code><code>); </code><code>// Bitmap->Mat</code>
<code> </code><code>this</code><code>.mat = mat_bmp;</code>
<code> </code><code>this</code><code>.config = config;</code>
<code> </code><code>this</code><code>.isGray = </code><code>false</code><code>;</code>
<code> </code><code>* @brief 构造函数,config默认为RGB_565</code>
<code> </code><code>* @see #BitmapUtil(Bitmap, Config)</code>
<code> </code><code>public</code> <code>Effector(Bitmap bmp) {</code>
<code> </code><code>this</code><code>(bmp, Bitmap.Config.RGB_565);</code>
<code> </code><code>* @brief 创建Bitmap</code>
<code> </code><code>* @return Bitmap</code>
<code> </code><code>public</code> <code>Bitmap create() {</code>
<code> </code><code>Mat mat_new = </code><code>this</code><code>.mat;</code>
<code> </code><code>if</code> <code>(isGray) {</code>
<code> </code><code>Mat mat_gray = </code><code>new</code> <code>Mat(mat_new.rows(), mat_new.cols(), CvType.CV_8UC4);</code>
<code> </code><code>Imgproc.cvtColor(mat_new, mat_gray, Imgproc.COLOR_GRAY2BGRA, </code><code>4</code><code>); </code><code>// 转为灰度4通道Mat</code>
<code> </code><code>mat_new = mat_gray;</code>
<code> </code><code>Bitmap bmp_new = Bitmap.createBitmap(mat_new.cols(), mat_new.rows(), </code><code>this</code><code>.config);</code>
<code> </code><code>Utils.matToBitmap(mat_new, bmp_new, </code><code>false</code><code>); </code><code>// Mat->Bitmap</code>
<code> </code><code>return</code> <code>bmp_new;</code>
<code> </code><code>* @brief 灰度化Bitmap</code>
<code> </code><code>public</code> <code>Effector gray() {</code>
<code> </code><code>Mat mat_bmp = </code><code>this</code><code>.mat;</code>
<code> </code><code>Mat mat_gray = </code><code>new</code> <code>Mat();</code>
<code> </code><code>Imgproc.cvtColor(mat_bmp, mat_gray, Imgproc.COLOR_BGRA2GRAY, </code><code>1</code><code>); </code><code>// 转为灰度单通道Mat</code>
<code> </code><code>this</code><code>.mat = mat_gray;</code>
<code> </code><code>this</code><code>.isGray = </code><code>true</code><code>;</code>
<code> </code><code>return</code> <code>this</code><code>;</code>
<code> </code><code>* @brief Bitmap二值化</code>
<code> </code><code>* @pre 需先灰度化{@link #gray()}</code>
<code> </code><code>* @param thresh 阈值。type为THRESH_OTSU时无用,其自适应区域阈值。</code>
<code> </code><code>* @param maxval 最大值。type为THRESH_BINARY或THRESH_BINARY_INV时才使用。</code>
<code> </code><code>* @param type 运算类型</code>
<code> </code><code>* @see Imgproc#threshold(Mat, Mat, double, double, int)</code>
<code> </code><code>* @see THRESH_OTSU: {@link Imgproc#adaptiveThreshold(Mat, Mat, double, int, int, int, double)}</code>
<code> </code><code>public</code> <code>Effector threshold(</code><code>double</code> <code>thresh, </code><code>double</code> <code>maxval, </code><code>int</code> <code>type) {</code>
<code> </code><code>if</code> <code>(!isGray) {</code>
<code> </code><code>// throw new IllegalArgumentException("must call gray() before this.");</code>
<code> </code><code>gray();</code>
<code> </code><code>Mat mat_gray = </code><code>this</code><code>.mat;</code>
<code> </code><code>Imgproc.threshold(mat_gray, mat_gray, thresh, maxval, type);</code>
<code> </code><code>* @details thresh: 127; maxval: 255; type: THRESH_OTSU;</code>
<code> </code><code>* @see #threshold(double, double, int)</code>
<code> </code><code>public</code> <code>Effector threshold() {</code>
<code> </code><code>return</code> <code>threshold(</code><code>127</code><code>, </code><code>255</code><code>, Imgproc.THRESH_OTSU);</code>
<code> </code><code>* @brief Canny算子边缘检测</code>
<code> </code><code>* @param threshold1 控制边缘连接的下限阈值</code>
<code> </code><code>* @param threshold2 控制强边缘的初始分割的上阈限值</code>
<code> </code><code>* 如果一个像素的梯度大于上阈限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。</code>
<code> </code><code>* 如果该点的梯度在两者之间则当这个点与高于上阈限值的像素点连接时我们才保留,否则抛弃。</code>
<code> </code><code>public</code> <code>Effector canny(</code><code>final</code> <code>double</code> <code>threshold1, </code><code>final</code> <code>double</code> <code>threshold2) {</code>
<code> </code><code>Mat mat = </code><code>this</code><code>.mat;</code>
<code> </code><code>Imgproc.Canny(mat, mat, threshold1, threshold2, </code><code>3</code><code>, </code><code>false</code><code>); </code><code>// Canny边缘检测</code>
<code> </code><code>* @brief Canny边缘检测,返回为RGB_565</code>
<code> </code><code>* @details threshold1: 80; threshold2: 90;</code>
<code> </code><code>* @see #canny(Bitmap, Config)</code>
<code> </code><code>public</code> <code>Effector canny() {</code>
<code> </code><code>return</code> <code>canny(</code><code>80</code><code>, </code><code>90</code><code>);</code>
<code> </code><code>* @brief Sobel处理</code>
<code> </code><code>public</code> <code>Effector sobel() {</code>
<code> </code><code>Imgproc.Sobel(mat, mat, CvType.CV_8U, </code><code>1</code><code>, </code><code>1</code><code>); </code><code>// 一阶差分</code>
<code> </code><code>Core.convertScaleAbs(mat, mat, </code><code>10</code><code>, </code><code>0</code><code>); </code><code>// 线性变换</code>
<code> </code><code>* @brief 棕褐色</code>
<code> </code><code>public</code> <code>Effector sepia() {</code>
<code> </code><code>Core.transform(mat, mat, getSepiaKernel());</code>
<code> </code><code>private</code> <code>Mat getSepiaKernel() {</code>
<code> </code><code>if</code> <code>(mSepiaKernel != </code><code>null</code><code>) {</code>
<code> </code><code>return</code> <code>mSepiaKernel;</code>
<code> </code><code>mSepiaKernel = </code><code>new</code> <code>Mat(</code><code>4</code><code>, </code><code>4</code><code>, CvType.CV_32F);</code>
<code> </code><code>mSepiaKernel.put(</code><code>0</code><code>, </code><code>0</code><code>, </code><code>/* R */0.189f, 0.769f, 0.393f, 0f);</code>
<code> </code><code>mSepiaKernel.put(1, 0, /* G */0.168f, 0.686f, 0.349f, 0f);</code>
<code> </code><code>mSepiaKernel.put(2, 0, /* B */0.131f, 0.534f, 0.272f, 0f);</code>
<code> </code><code>mSepiaKernel.put(3, 0, /* A */</code><code>0</code><code>.000f, </code><code>0</code><code>.000f, </code><code>0</code><code>.000f, 1f);</code>
<code> </code><code>return</code> <code>mSepiaKernel;</code>
# Over
常用的一些方法就这样了^^。
本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/1202128,如需转载请自行联系原作者