天天看点

Android处理Bitmap的一些方法

# 文件与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 &amp;&amp; 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 &amp;&amp; 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>&amp;&amp; y == </code><code>0</code> <code>&amp;&amp; width == src.getWidth() &amp;&amp; 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 -&gt; mat -&gt; 接口处理 -&gt; mat_new -&gt; 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-&gt;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-&gt;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 &gt; src.getWidth()) {</code>

<code>        </code><code>throw</code> <code>new</code> <code>IllegalArgumentException(</code><code>"x + width must be &lt;= bitmap.width()"</code><code>);</code>

<code>    </code><code>if</code> <code>(y + height &gt; src.getHeight()) {</code>

<code>        </code><code>throw</code> <code>new</code> <code>IllegalArgumentException(</code><code>"y + height must be &lt;= 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 &lt;a href="http://stackoverflow.com/questions/12852578/image-rotation-with-opencv-in-android-cuts-off-the-edges-of-an-image"&gt;More&lt;/a&gt;</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-&gt;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-&gt;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,如需转载请自行联系原作者

继续阅读