0

私のアプリケーションは、カメラから画像を取得して保存し、に表示しますImageViewが、次のステップは、ユーザーが画面に触れたときに表示された画像の上に円を配置し、「変更された画像」を保存することです。

必要に応じて画像エディターのようなものですが、問題は、画像編集をどこから始めればよいかわかりません。私はこれを試しました

  @Override
public boolean onTouch(View v, MotionEvent event) {
    circleView.setVisibility(View.VISIBLE);
    circleView.setX(event.getX()-125);
    circleView.setY(event.getY()-125);

   try{
        Bitmap bitmap = Bitmap.createBitmap(relativeLayout.getWidth(),relativeLayout.getHeight(),Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        v.draw(canvas);

        mImageView.setImageBitmap(bitmap);
        FileOutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory());

        bitmap.compress(Bitmap.CompressFormat.PNG,100,output);
        output.close();
    }catch(FileNotFoundException e){
        e.printStackTrace();
    }catch (IOException e){
        e.printStackTrace();
    }


    return true;
}//ENDOF onTouch

画像を保存するにはどうすればよいですか?

4

1 に答える 1

1

使用しているライブラリと言語について、もう少し情報を含めていただけると助かります。@override から、これは Android 上の Java だと思いますか?

円を作成する方法については、使用できるテクニックがたくさんあり、これを行うために使用できるライブラリがおそらくいくつかあります。ただし、Bitmap オブジェクトのインターフェイスで関数、つまり getPixels と setPixels を使用することで、非常にシンプルに保つことができます。

必要なことは、(getPixels を使用して) 事前に割り当てられたバッファーにピクセルの四角形を取得し、このバッファーに円を描画してから、「setPixels」を使用してバッファーを書き戻すことです。javaish 疑似コード (未テスト) で「getPixels」から取得するバッファーに円を描画するための単純な (ただし、正確には効率的ではありません) メソッドを次に示します。

//Return the distance between the point 'x1, y1' and 'x2, y2'
float distance(float x1, float y1, float x2, float y2)
{
    float dx = x2 - x1;
    float dy = y2 - y1;
    return Math.sqrt(dx * dx + dy * dy);
}

//draw a circle in the buffer of pixels contained in 'int [] pixels' 
//at position 'cx, cy' with the given radius and colour.
void drawCircle(int [] pixels, int stride, int height, float cx, float cy, float radius, int colour) 
{
    for (int y = 0; y < height; ++y) 
        for (int x = 0; x < stride; ++x) 
        {
            if (distance((float)x, (float)y, cx, cy) < radius)
               pixels[x + y * stride] = colour;
        }
}

これは、各ピクセルについて、「点 'x,y' は 'cx, cy, radius' で指定された円の内側にありますか?」という質問をするだけです。そうであれば、ピクセルを描画します。より効率的なアプローチには、円の左側と右側を通過するスキャンライン ラスタライザーが含まれ、各ピクセルに対してコストのかかる「距離」計算を行う必要がなくなります。

ただし、この「暗黙的なサーフェス」アプローチは非常に柔軟で、多くの効果を実現できます。他のオプションは、その場で独自の円ビットマップを作成する代わりに、事前に作成された円ビットマップをコピーすることです。

「距離 - 半径」の小数値に基づいて「色」をブレンドして、アンチエイリアシングを実現することもできます。

于 2016-08-16T18:32:27.903 に答える