Как нарисовать круг поверх изображения

Мое приложение берет изображение с камеры, сохраняет его, а затем отображает его на 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 на Android?

Что касается того, как создать круг - есть много техник, которые вы могли бы использовать, и, вероятно, есть больше, чем несколько библиотек, которые вы можете использовать для этого. Однако мы можем сделать это довольно просто, используя функции интерфейса объекта Bitmap, а именно getPixels и setPixels.

Что вам нужно сделать, это захватить прямоугольник пикселей в заранее выделенном буфере (используя getPixels), затем нарисовать ваш круг в этом буфере и затем записать буфер обратно, используя setPixels. Вот простой (хотя и не совсем эффективный) метод для рисования круга в буфере, который вы получите из 'getPixels' в псевдокоде Java (непроверенный):

//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 "?" и если это так, он нарисует пиксель. Более эффективные подходы могут включать растровое растровое изображение, которое проходит через левую и правую стороны круга, устраняя необходимость в дорогостоящем вычислении "расстояния" для каждого пикселя.

Тем не менее, этот подход "неявной поверхности" является достаточно гибким, и вы можете достичь многих результатов с его помощью. Другие варианты могут заключаться в том, чтобы скопировать предварительно созданный круговой рисунок вместо создания собственного на лету.

Вы также можете смешать "цвет" на основе дробного значения "расстояние - радиус" для достижения сглаживания.

Другие вопросы по тегам