# 檔案與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,如需轉載請自行聯系原作者