最近、OpenCV を使用した Android 上での可視光位置決めのアプリを作成しています。輪郭認識の際に、偶然にもスマートフォン内の 2 次元画像をサンプルとして使用してテストしたところ、線が非常に明瞭に表示されました。以下の画像のような感じです:
これは線画ではないでしょうか。もしかしたら、画像を線画に変換するためのワンクリックアプリを作成できるかもしれません。将来的に役立つかもしれません。また、絵を描くのが好きな人にとっても便利で有用なツールになるでしょう。
そこで、可視光位置決めのプロジェクトをコピーして、パッケージ名を変更し、ロゴと背景画像を変更し、UI を再設定し、画像の長押し保存機能を追加し、さまざまなテストとデバッグを行いました。2 日間の作業の結果、安定したバージョンを完成させ、リリース版とプロジェクトを私のGitee リポジトリに置きました。
キーコードの一部:#
画像の保存:#
// 画像の長押し保存
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 ライブラリのみを使用しているため、Redmi Note 1 と Xiaomi 6X でのテストではスムーズに動作しました。したがって、ほぼすべての Android スマートフォンに対応していると考えていますが、Android タブレットについては互換性がわかりません。