“1,2,线稿!”APP的开发关键代码与演示。
最近在写OpenCV在Android上用于可见光定位的APP,在轮廓识别的时候偶然用手机里的二次元图片作为样本进行测试,发现线条十分明显,就像下面这张图这样:
这不就是线稿吗,或许可以写一个一键将图片转成线稿的APP,万一以后用得到呢。而且对于绘画爱好者来说至少也很方便和有用处。
于是将自己用来写可见光定位的项目复制一份,修改包名,换个Logo和背景图,然后重新设置了UI,加了长按保存图片的功能,最后各种测试和debug,两天时间,成功做出了一个稳定的版本,然后将发行版和项目放到了我的码云仓库上。
关键部分的代码:
保存图片:
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 27 28 29
| 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(); } } }
|
刷新媒体库:
1 2 3 4 5 6 7 8 9 10 11 12
| private void updateGallery(String 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); } }); }
|
生成目录和随机文件名:
1 2 3 4 5 6 7 8 9 10
| 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上测试时均可流畅运行,因而目前认为支持现有的几乎所有的安卓智能手机,对安卓平板是否兼容尚不可知。