Обрезать изображение в андроиде

Я хочу обрезать изображение, я нашел несколько довольно полезных, но почему-то это похоже на отсутствие затемнения невыбранных областей, поэтому мне интересно, кто-нибудь знает, как это сделать? или вести меня в правильном направлении? Онлайн-учебник, который я нашел, показывает, что он затемнит выбранную область, но когда я его использую, этого не произойдет. Пожалуйста, помогите мне большое спасибо и извините за мое плохое знание английского языка.

Ссылки на учебник, которым я пользуюсь.

Руководство по кадрированию изображения 1

Руководство по обрезке изображения 2

Я хочу, чтобы это было что-то вроде этого.

Я хочу, чтобы это было примерно так

editButton.setOnClickListener(new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent goEdit;
            goEdit = new Intent(PreviewActivity.this, CropImage.class);
            goEdit.putExtra("image-path", path);
            goEdit.putExtra("scale", true);
            goEdit.putExtra("fileName", nameFromPath);
            //finish();
            checkEdit = true;
            startActivityForResult(goEdit,0);

        }
});

РЕДАКТИРОВАТЬ Я использую этот прослушиватель кнопок для обращения к файлу урожая, вызывая действие класса CropImage. Это специальное намерение, а не функция обрезки внутри Android, но я думаю, что это ее копия, чтобы она поддерживала все версии, но когда я вызываю ее, выбранная область не становится ярче, и я не знаю, в чем проблема. может ли кто-нибудь помочь мне? Спасибо. Это библиотека, которую я использую drioid4you обрезает изображение< /а>


person I Yeu C    schedule 05.03.2013    source источник
comment
Пожалуйста, можете ли вы опубликовать код, который вы пробовали? А также, опишите, что происходит, когда вы пытаетесь это сделать? Вы получаете сообщение об ошибке любого рода?   -  person CL22    schedule 05.03.2013
comment
я имею в виду, что я не получил никакого сообщения об ошибке, я просто понятия не имею, как сделать выделенную область ярче, а невыбранную область затемнить, чтобы показать различия   -  person I Yeu C    schedule 06.03.2013
comment
Проверьте [этот вопрос] [1] для альтернативной библиотеки, которую я предложил там. [1]: stackoverflow.com/questions/12758425/   -  person hcpl    schedule 23.05.2013
comment
пожалуйста, правильно объявите, как использовать ручной вид обрезки ....   -  person Ramani Hitesh    schedule 26.10.2017
comment
Проверьте этот ответ на переполнение стека: stackoverflow.com /вопросы/38367876/   -  person Hitesh Kanjani    schedule 25.05.2018


Ответы (4)


Можете ли вы использовать стандартную функциональность Android Crop?

Вот мой код

private void performCrop(Uri picUri) {
    try {
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        // indicate image type and Uri
        cropIntent.setDataAndType(picUri, "image/*");
        // set crop properties here
        cropIntent.putExtra("crop", true);
        // indicate aspect of desired crop
        cropIntent.putExtra("aspectX", 1);
        cropIntent.putExtra("aspectY", 1);
        // indicate output X and Y
        cropIntent.putExtra("outputX", 128);
        cropIntent.putExtra("outputY", 128);
        // retrieve data on return
        cropIntent.putExtra("return-data", true);
        // start the activity - we handle returning in onActivityResult
        startActivityForResult(cropIntent, PIC_CROP);
    }
    // respond to users whose devices do not support the crop action
    catch (ActivityNotFoundException anfe) {
        // display an error message
        String errorMessage = "Whoops - your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}

объявить:

final int PIC_CROP = 1;

вверху.

В методе результата onActivity напишите следующий код:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PIC_CROP) {
        if (data != null) {
            // get the returned data
            Bundle extras = data.getExtras();
            // get the cropped bitmap
            Bitmap selectedBitmap = extras.getParcelable("data");

            imgView.setImageBitmap(selectedBitmap);
        }
    }
}

Для меня это довольно легко реализовать, а также показывает затемненные области.

person Akbari Dipali    schedule 06.03.2013
comment
Привет, я пробую ваш код, но он по-прежнему не показывает темную область на моем телефоне :( Интересно, это из-за моего манифеста? Или версии телефона? - person I Yeu C; 06.03.2013
comment
какую версию вы используете? - person Akbari Dipali; 06.03.2013
comment
странно то, что когда я просто использую обычное приложение, оно будет отображаться, но как только я использую его в своем приложении, которое я разрабатываю, оно не появится. интересно, почему - person I Yeu C; 06.03.2013
comment
попробуйте установить ‹uses-feature android:name=android.hardware.camera › ‹/uses-feature› и ‹uses-permission android:name=android.permission.CAMERA /› и ‹uses-sdk android:minSdkVersion=11 android :targetSdkVersion=11 /› Я не уверен, что это поможет, но попробуйте - person Akbari Dipali; 06.03.2013
comment
‹uses-sdk android:minSdkVersion=8 android:targetSdkVersion=15 /› - person I Yeu C; 06.03.2013
comment
да, это работает, хахаха, большое спасибо, я изменил minsdkversion, все работает, хахаха, большое спасибо :) - person I Yeu C; 06.03.2013
comment
Я продолжаю получать исключение ActivityNotFoundException при попытке использовать приведенный выше код. Я пробовал 2.2, 2.3.3, 4.1 и 4.2. Любые идеи? Похоже, что фильтр намерений com.android.camera.action.CROP не может быть найден ни на одном из моих устройств?? - person speedynomads; 25.04.2013
comment
@domji84 установили ли вы ‹uses-feature android:name=android.hardware.camera › ‹/uses-feature› и ‹uses-permission android:name=android.permission.CAMERA /› в файле манифеста? - person Akbari Dipali; 25.04.2013
comment
Я нашел проблему. Я устанавливал только uri данных, а не тип данных. исправлено с помощью намерения.setDataAndType(myImageURI, image/*). Благодарность - person speedynomads; 25.04.2013
comment
благодаря. на самом деле, у меня все еще есть проблема. selectedBitmap в onActivityResult всегда имеет значение null. Любые идеи? - person speedynomads; 25.04.2013
comment
Не могли бы вы отладить код и проверить дополнительный параметр Intent data? содержит ли он данные или нет? - person Akbari Dipali; 25.04.2013
comment
этот параметр данных равен нулю. почему это происходит? - person speedynomads; 25.04.2013
comment
@AkbariDipali Эй, ваши коды работают нормально, но выбранный битмап, который я получил, всегда имеет ширину и высоту 160, даже если я установил cropIntent.putExtra(outputX, 300); урожаяIntent.putExtra(outputY, 300); - person AndroidDev; 28.06.2013
comment
@AndroidCoder, пожалуйста, взгляните на заголовок stackoverflow.com/questions/12758425/ это может вам помочь - person Akbari Dipali; 28.06.2013
comment
@AkbariDipali Да, я просматриваю код и после выполнения шага, упомянутого в ответе ... я попытался масштабировать свое растровое изображение, используя следующий код ... но это снижает качество изображения ... pastebin.com/Y0R52gAp - person AndroidDev; 28.06.2013
comment
да, масштабирование растрового изображения снизит качество изображения. Но в моем случае я получал изображение 128X128. - person Akbari Dipali; 28.06.2013
comment
может быть, это проблема конкретного устройства, она написана в stackoverflow.com/questions/12758425/ - person Akbari Dipali; 28.06.2013
comment
@AkbariDipali Да, я знаю, что в вашем случае вы используете изображение 128 x 128. Но в моем случае я разрешаю пользователю выбирать собственное изображение из галереи, а затем обрезать это изображение в круглой форме и показывать им. Но дело в том, как масштабировать изображение в круглой форме с потерей качества. - person AndroidDev; 28.06.2013
comment
Ох, хорошо. Я понимаю. Я не пробовал масштабировать, но в стеке есть много потоков, когда я гуглил для scale image without losing quality in android. не могли бы вы проверить один? Я также попробую со своей стороны, и если найду какое-либо решение, то дам вам - person Akbari Dipali; 28.06.2013
comment
@AkbariDipali Большое спасибо... я тоже буду искать - person AndroidDev; 28.06.2013
comment
Привет, спасибо за ответ, у меня есть один вопрос: как найти путь к файлу изображения в методе результата действия? (Я не хочу использовать растровое изображение или данные, которые я хочу использовать для пути к изображению, потому что я хочу загрузить его на свой сервер?) - person Ersin Gülbahar; 13.05.2014
comment
вы можете использовать picUri.getPath(), чтобы получить путь. Или, если вы хотите загрузить растровое изображение на сервер, Bitmap selectedBitmap = extras.getParcelable(data); объявите эту растровую переменную на уровне вашей активности и используйте это растровое изображение для преобразования в outpuststream. просто попробуйте! - person Akbari Dipali; 13.05.2014
comment
Привет @AkbariDipali .. Я использую ваше решение. Работает нормально. Но размер моего изображения становится слишком маленьким после обрезки. Как исправить размер изображения? Например, мне нужен размер изображения 100X100. И я не хочу уменьшать пиксель (качество изображения). - person Vijay; 20.03.2015
comment
@Vijay, вы можете изменить значения здесь: cropIntent.putExtra(outputX, your_desired_size); cropIntent.putExtra (outputY, your_desired_size); . Я использовал здесь 128, так как мне нужно было изображение размером с миниатюру. - person Akbari Dipali; 20.03.2015
comment
В моем случае data.getExtras() возвращает null, тогда как я могу получить Bitmap? - person SilentKnight; 12.06.2015
comment
Не работает на Lolipop (5.1.1). Такие устройства, как moto g и Nexus 5, выдают исключение ActivityNotFoundException.... Отлично работают на Kitkat и Jelly Bean... - person NikW; 27.10.2015
comment
Объявите, как обрезать изображение вручную и обрезать изображение зеленой рукой Android - person Ramani Hitesh; 26.10.2017
comment
в коде не идеальное ручное отображение кадрирования и кадрирование изображения андроида - person Ramani Hitesh; 26.10.2017
comment
Для таких устройств, как Samsung S6, он также не запускает функцию кадрирования. Это означает, что не вызывается намерение. - person blackjack; 05.01.2018

Эта библиотека: Android-Image-Cropper очень мощна для CropImages. На данный момент у него 3731 звезда на github.

Вы обрежете свои изображения с помощью нескольких строк кода.

1 - Добавьте зависимости в buid.gradle (Модуль: приложение)

compile 'com.theartofdev.edmodo:android-image-cropper:2.7.+'

2 - Добавьте разрешения в AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3 - Добавьте CropImageActivity в AndroidManifest.xml

<activity android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
 android:theme="@style/Base.Theme.AppCompat"/>

4 - Начните занятие с одного из приведенных ниже случаев, в зависимости от ваших требований.

// start picker to get image for cropping and then use the image in cropping activity
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.start(this);

// start cropping activity for pre-acquired image saved on the device
CropImage.activity(imageUri)
.start(this);

// for fragment (DO NOT use `getActivity()`)
CropImage.activity()
.start(getContext(), this);

5 - Получить результат в onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
    CropImage.ActivityResult result = CropImage.getActivityResult(data);
    if (resultCode == RESULT_OK) {
      Uri resultUri = result.getUri();
    } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
      Exception error = result.getError();
    }
  }
}

Вы можете выполнить несколько настроек, установив соотношение сторон или форму на ПРЯМОУГОЛЬНИК, ОВАЛ и многое другое.

person Soon Santos    schedule 23.08.2018
comment
Я столкнулся с проблемой, что после обрезки мой uri начинается с «file:///», но я хочу, чтобы «content://» сбой при получении пути к строке. - person Kishan; 09.01.2019
comment
как я могу сохранить изображение после кадрирования - person Vinit Poojary; 07.02.2019
comment
Использование команды: mImageProfile.setImageBitmap(result.getBitmap()); возвращает пустое изображение, я имею в виду, что изображение не видно. Но с помощью команды: mImageProfile.setImageURI(result.getUri()); работает нормально. - person Aliton Oliveira; 23.05.2019
comment
Вы также можете запустить его из CustomAdapter с помощью этой команды: CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).start((AppCompatActivity) context); - person Aliton Oliveira; 24.05.2019
comment
Я использую эту библиотеку в своем realme 3 pro с Android 10, и она не показывает опцию для галереи, она показывает только опцию для камеры, однако эта опция галереи видна для nexus 5x и realme U1 с Android 9. Какие-либо предложения. - person Akshay Rajput; 04.07.2020

Я нашел действительно классную библиотеку, попробуйте ее. это действительно гладко и легко в использовании.

https://github.com/TakuSemba/CropMe

person Taku Semba    schedule 13.09.2017
comment
вы буквально сделали эту библиотеку. в этом нет ничего плохого, но, по крайней мере, не пытайтесь ввести людей в заблуждение, заставляя их думать, что вы нашли это, или подумайте о том, чтобы опубликовать это с заявлением об отказе от ответственности. - person darkrider1287; 28.08.2019
comment
эта библиотека не имеет правильных инструкций по использованию с Fragments. Кроме того, автор плохо отвечает на вопросы. - person Imustech S; 10.05.2020

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

наслаждайся работой :)

person John smith    schedule 15.02.2016
comment
Ваша суть не включает R.styleable. так сложно, чтобы заставить ее работать, особенно для строковых атрибутов. - person Xenolion; 25.03.2020