Я хочу захватить только часть в прямоугольнике, нажав кнопку и сохранить ее в хранилище См. Здесь изображение Я создаю приложение, фон - предварительный просмотр камеры, прямоугольник присутствует на по центру (прямоугольник создается путем создания четырех макетов вокруг прямоугольника и установки их цвета фона на частично прозрачный, чтобы он выглядел как наложение, добавляется, когда я нажимаю кнопку захвата изображения, он захватывает изображение предварительного просмотра всего экрана, но я хочу только изображение части, которая присутствует в прямоугольнике, вот что я попробовал,
captuteimageonpro.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
camera.takePicture(null, null, mPictureCallback);
}
});
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int start_width = (int) (width * 0.15);
int start_height = (int) (height * 0.16);
int end_width = start_width + (int) (width * 0.70);
int end_height = start_height + (int) (height * 0.52);
//the decimal values in above lines are the percentages of the rectangle position relative to screen
int no_pixels = (end_width - start_width) * (end_height - start_height);
int[] pixels = new int[no_pixels];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.getPixels(pixels, 0, (end_width - start_width), start_width, start_height, (end_width - start_width), (end_height - start_height));
bitmap = Bitmap.createBitmap(pixels, 0, (end_width - start_width), (end_width - start_width), (end_height - start_height), Bitmap.Config.ARGB_8888);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
bitmap.recycle();
File picture_file = getOutputMediaFile();
if(picture_file == null)
{
return;
}
else {
try {
FileOutputStream fos = new FileOutputStream(picture_file);
fos.write(byteArray);
fos.close();
camera.startPreview();
}catch (FileNotFoundException e)
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
};
private File getOutputMediaFile()
{
String state = Environment.getExternalStorageState();
if(!state.equals(Environment.MEDIA_MOUNTED))
{
return null;
}
else
{
File folder_gui = new File(Environment.getExternalStorageDirectory()+ File.separator+"GUI");
if(!folder_gui.exists())
{
folder_gui.mkdirs();
}
File outputFile = new File(folder_gui,"temp.jpg");
return outputFile;
}
Проблема, с которой я сталкиваюсь, заключается в том, что на некоторых телефонах четкость изображения, снятого в этой части, настолько плоха, как будто оно размытое, в некоторых телефонах изображение сохраняется повернутым, может кто-нибудь мне помочь, есть ли любые изменения, которые я должен сделать, или есть ли другой способ сделать это эффективно.
Я не хочу обрезать изображение вручную, просто после нажатия кнопки часть предварительного просмотра камеры, которая присутствует в прямоугольнике, должна быть сохранена в памяти.