この記事は公開から4年以上経過しています。
「Androidで画像を回転して保存したい」という話を聞き、早速実験してみた結果の備忘録です。
わざわざ統合開発環境でAndroidアプリを作るまでもなさそうなので、Android上でC#開発が楽しめるアプリC# Shell
で試してみたところ思いの外あっさり実現できました。
スマホ上での開発の操作性は決して良いとは言えませんが、Androidスマホだけでちょっとしたスマホアプリが開発できるとは、なんとも素晴らしい時代になったものです。
このプログラムはローカルストレージ上のファイル書き込み操作を行います。ファイル喪失等にも繋がりかねないため、プログラム実行の際は、充分にご注意下さい。
サンプルソースコード
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Android.Graphics;
namespace CSharp_Shell
{
public static class Program
{
public static void Main()
{
// 元画像読み込み(ローカルストレージPicturesフォルダ内のbefore.jpgを読み込む)
using(var bmpIn = BitmapFactory.DecodeFile("/storage/emulated/0/Pictures/before.jpg"))
{
// 90度回転
var mtx = new Matrix();
mtx.PostRotate(90);
// 出力画像作成
using(var bmpOut = Bitmap.CreateBitmap(bmpIn, 0, 0, bmpIn.Width, bmpIn.Height, mtx, true))
{
// 出力画像書き込み(ローカルストレージPicturesフォルダにafter.jpgとして保存)
using(var fs = new FileStream("/storage/emulated/0/Pictures/after.jpg", FileMode.Create))
{
// Jpeg 画質100%
bmpOut.Compress(Bitmap.CompressFormat.Jpeg, 100, fs);
}
}
}
}
}
}
ちなみに、C# Shell
のプロジェクトの設定から
Mono.Android.dll
Java.Interop.dll
を参照ライブラリとして追加する必要がありました。
後者のライブラリについてはどうやらC# Shell
のコンパイラが使うようで、これを追加していないとusingステートメント周りに謎のコンパイルエラーが発生しましたが、エラーが出ないのであれば不要かもしれません。
この例では簡略化のためにファイル名を決め打ちにしていますが、応用次第でデバイス上の複数ファイルを一括で加工することも可能です。
以上です。