最近在寫 OpenCV 在 Android 上用於可見光定位的 APP,在輪廓識別的時候偶然用手機裡的二次元圖片作為樣本進行測試,發現線條十分明顯,就像下面這張圖這樣:
這不就是線稿嗎,或許可以寫一個一鍵將圖片轉成線稿的 APP,萬一以後用得到呢。而且對於繪畫愛好者來說至少也很方便和有用處。
於是將自己用來寫可見光定位的項目複製一份,修改包名,換個 Logo 和背景圖,然後重新設置了 UI,加了長按保存圖片的功能,最後各種測試和 debug,兩天時間,成功做出了一個穩定的版本,然後將發行版和項目放到了我的碼雲倉庫上。
關鍵部分的代碼:#
保存圖片:#
//長按保存圖片
public static void saveBitmap(ImageView view, String filePath) {
Drawable drawable = view.getDrawable();
if (drawable == null) {
return;
}
FileOutputStream outStream = null;
File file = new File(filePath);
if (file.isDirectory()) {//如果是目錄不允許保存
return;
}
try {
outStream = new FileOutputStream(file);
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
outStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (outStream != null) {
outStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
刷新媒體庫:#
//刷新媒體庫
private void updateGallery(String filename)//filename是我們的文件全名,包括後綴哦
{
MediaScannerConnection.scanFile(this,
new String[] { filename }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
生成目錄和隨機文件名:#
//隨機文件名
private String generateFileName() {
String fileList = getExternalStorageDirectory().getAbsolutePath() + File.separator + "LineDraft" + File.separator;
File mkdir = new File(fileList);
if(!mkdir.exists()) mkdir.mkdir();
@SuppressLint("SimpleDateFormat") DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");// 获得当前时间
String formatDate = format.format(new Date());// 轉換為字符串
int random = new Random().nextInt(10000);// 隨機生成文件編號
return (fileList + formatDate + random + ".png");
}
預覽:
歡迎界面 | 主界面 | 轉換並保存 |
由於只使用了 ARM 架構的 OpenCV 庫,在紅米 Note1 和小米 6X 上測試時均可流暢運行,因而目前認為支持現有的幾乎所有的安卓智能手機,對安卓平板是否兼容尚不可知。