2016-08-16 1 views
0

Mon application prend une image de la caméra, l'enregistre puis l'affiche sur un ImageView, mais l'étape suivante consiste à placer un cercle au-dessus de l'image affichée lorsque l'utilisateur touche l'écran, puis enregistre l'image modifiée. Un peu comme un éditeur d'image si vous le souhaitez, le problème est que je ne sais pas par où commencer avec l'édition d'image. J'ai essayé ceciComment dessiner un cercle au-dessus d'une image

@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 

Que puis-je faire pour enregistrer l'image?

Répondre

1

Il serait utile que vous fournissiez un peu plus d'informations sur les bibliothèques et la langue que vous utilisez. De la @override je suppose que c'est Java sur Android? En ce qui concerne la création d'un cercle, il existe de nombreuses techniques que vous pouvez utiliser et il existe probablement plus de quelques bibliothèques que vous pouvez utiliser pour cela. Cependant, nous pouvons le garder assez simple en utilisant des fonctions sur l'interface de l'objet Bitmap, à savoir getPixels et setPixels. Ce que vous devez faire est de saisir un rectangle de pixels dans le tampon pré-alloué (en utilisant getPixels), puis dessinez votre cercle dans ce tampon, puis réécrivez le tampon en utilisant 'setPixels'. Voici une méthode simple (mais pas exactement efficace) pour dessiner un cercle dans le tampon que vous obtiendrez de « getPixels » à javaish pseudocode (non testé):

//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; 
     } 
} 

Cela demande simplement la question, pour chaque pixel, 'est le point' x, y 'à l'intérieur du cercle donné par' cx, cy, radius '?' et si c'est le cas, il dessine un pixel. Des approches plus efficaces pourraient inclure un rastériseur de ligne de balayage qui parcourt les côtés gauche et droit du cercle, éliminant le besoin d'effectuer un calcul de distance coûteux pour chaque pixel. Cependant, cette approche de 'surface implicite' est assez flexible et vous pouvez obtenir beaucoup d'effets avec celle-ci. D'autres options pourraient être de copier un bitmap de cercle pré fait au lieu de créer le vôtre à la volée.

Vous pouvez également mélanger la 'couleur' ​​en fonction de la valeur fractionnaire de 'distance-rayon' pour obtenir l'anti-crénelage.