2016-08-16 9 views
0

Мое приложение принимает изображение с камеры, сохраняет его, а затем отображает его на ImageView, но следующим шагом будет поместить круг поверх отображаемого изображения, когда пользователь коснется экрана, а затем сохранит «измененное изображение».Как нарисовать круг в верхней части изображения

Kinda как редактор изображений, если хотите, проблема в том, что я не знаю, с чего начать с редактирования изображения. Я пробовал это

@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» в javaish псевдокода (непроверенный):

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

Однако этот подход «неявной поверхности» довольно гибкий, и с ним можно добиться большого количества эффектов. Другие варианты могут заключаться в том, чтобы скопировать предварительно обработанный битовый массив, а не создавать свои собственные на лету.

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

 Смежные вопросы

  • Нет связанных вопросов^_^