2016-08-16 10 views
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 

私は画像を保存するために何ができますか?

答えて

1

あなたが使用しているライブラリと言語に関するさらに詳しい情報を含めると便利です。 @overrideから、これはアンドロイドの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; 
     } 
} 

これだけの各画素について、質問をします、 'は、' cx、cy、radius 'によって与えられる円の内側の点' x、y 'ですか?そうであれば、ピクセルを描画します。 より効率的な手法には、サークルの左右をスキャンするスキャンラインラスタライザが含まれているため、各ピクセルに対して高価な「距離」計算を行う必要がありません。

しかし、この「暗示的な表面」アプローチは非常に柔軟性があり、多くの効果を得ることができます。他のオプションは、オンザフライで自分自身を作成するのではなく、事前に作成したサークルのビットマップをコピーすることです。

また、アンチエイリアスを実現するために '距離 - 半径'の端数値に基づいて '色'をブレンドすることもできます。