編輯:關於Android編程
KqwOpenCVBlurDemo
銳化也可以看作是一種線性濾波操作,並且錨點像素有較高的權重,而周圍的像素權重較低。
因此,我們可以自定義一個這樣的核。
/* 自定義核 0 -1 0 -1 5 -1 0 -1 0 */ Mat kernel = new Mat(3, 3, CvType.CV_16SC1); kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
這裡我們將圖像的深度設為16SC1,表示包含一個通道(C1),圖像中的每個像素包含一個16比特有符號整型數(16S)。
定義完核以後,我們對圖像和核做卷積操作
// 對圖像和自定義核做卷積
Imgproc.filter2D(src, src, src.depth(), kernel);
第一個參數表示輸入的圖像 第二個參數表示輸出的圖像 第三個參數表示圖像的深度 第四個參數是我們自定義的核
封裝
這裡我用到了RxJava。主要是因為圖片處理是耗時操作,會阻塞線程,為了防止界面卡頓,這裡使用RxJava進行了線程切換。
/**
* 銳化圖片
*
* @param bitmap 要處理的圖片
*/
public void filter2D(Bitmap bitmap) {
// 使用RxJava處理圖片
if (null != mSubscriber)
Observable
.just(bitmap)
.map(new Func1() {
@Override
public Bitmap call(Bitmap bitmap) {
// Bitmap轉為Mat
Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4);
Utils.bitmapToMat(bitmap, src);
/*
自定義核
0 -1 0
-1 5 -1
0 -1 0
*/
Mat kernel = new Mat(3, 3, CvType.CV_16SC1);
kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
// 對圖像和自定義核做卷積
Imgproc.filter2D(src, src, src.depth(), kernel);
// Mat轉Bitmap
Bitmap processedImage = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(src, processedImage);
return processedImage;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mSubscriber);
}
調用
// 圖片處理的工具類
mBlurUtil = new BlurUtil(new Subscriber() {
@Override
public void onCompleted() {
// 圖片處理完成
dismissProgressDialog();
}
@Override
public void onError(Throwable e) {
// 圖片處理異常
dismissProgressDialog();
}
@Override
public void onNext(Bitmap bitmap) {
// 獲取到處理後的圖片
mIvImageProcessed.setImageBitmap(bitmap);
}
});
// 銳化圖片
mBlurUtil.filter2D(mSelectImage);
我們經常會看到很多優秀的app上面都有一些很漂亮的控件,用戶體驗非常好,比如togglebutton就是一個很好的例子,IOS系統下面那個精致的togglebutton如
內存洩露排查手記 Time:2013.09.02 Author:sodino 問題現象: 這裡內存洩露是指已實例化的對象長期被hold住且無法釋放或不能
前些天就看到相關內容了,但是最近吸毒比較深(wow),所以沒有緊跟潮流,今天補一篇。https://github.com/ddwhan0123/Useful-Open-S
在Android上有很多不規則按鈕。如: vcv7o6zV4rj2yrG68s7Sw8e74beiz9ajrLu5w7vT0LTvtb3SqrXE0Ke5+6Osu7nT