Создать изображение с пользовательским текстом в Android - PullRequest
7 голосов
/ 03 февраля 2012

Я пытаюсь сделать приложение для создания пользовательских карт.Я хотел бы добавить текст поверх пользовательского фона (изображение jpg).

Каков наилучший способ сделать это?Мне нужно показать пользователю предварительный просмотр карты перед отправкой на сервер.

Спасибо

Ответы [ 2 ]

28 голосов
/ 03 февраля 2012

Используйте приведенный ниже код для достижения ваших требований

    Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.yourimage); // the original file yourimage.jpg i added in resources
    Bitmap dest = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);

    String yourText = "My custom Text adding to Image";

    Canvas cs = new Canvas(dest);
    Paint tPaint = new Paint();
    tPaint.setTextSize(35);
    tPaint.setColor(Color.BLUE);
    tPaint.setStyle(Style.FILL);
    cs.drawBitmap(src, 0f, 0f, null);
    float height = tPaint.measureText("yY");
    float width = tPaint.measureText(yourText);
    float x_coord = (src.getWidth() - width)/2;
    cs.drawText(yourText, x_coord, height+15f, tPaint); // 15f is to put space between top edge and the text, if you want to change it, you can
    try {
        dest.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File("/sdcard/ImageAfterAddingText.jpg")));
        // dest is Bitmap, if you want to preview the final image, you can display it on screen also before saving
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Вы должны использовать указанные ниже разрешения в файле манифеста.

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

Для моего устройства путь /sdcard для доступа к внешней SD-карте может отличаться для других устройств. Некоторые устройства могут иметь /mnt/sdcard, может быть, это для внутренних SD-карт. Просто проверьте это, прежде чем использовать этот код.

На самом деле я написал приведенный выше код для какого-то другого вопроса, который требовал отметки времени на фотографии после съемки с камеры. Я дал вам то же решение с небольшими изменениями для вашего конкретного требования.

Я надеюсь, вы можете это понять. Если у вас есть какие-либо сомнения относительно кода, не стесняйтесь спрашивать.

4 голосов
/ 03 февраля 2012

Я не уверен, что это лучшее решение, но оно может вам помочь.

Шаг 1: создайте относительный макет (на любом другом) и установите свое изображение в качестве фона.

Шаг 2: Теперь добавьте текстовое представление с шириной и высотой как fill_parent или match_parent, а также с гравитацией как top | center_horizont.

Шаг 3: Теперь добавьте еще одну кнопку или любой другой элемент управления макетом, который вызовет подтверждение пользователя. (Вы должны поместить этот элемент управления вне Относительного расположения).

Шаг 4: Если пользователь подтвердил изображение, вы можете сделать снимок вашего относительного макета с помощью следующего кода:

v1.setDrawingCacheEnabled(true);//v1 is the object of your Relative layout
            Bitmap bm = v1.getDrawingCache();
            if (bm != null) {

                //TODO:write the code for saving the image.

                Toast toast = Toast.makeText(YourActivity.this, "image saved",
                        Toast.LENGTH_LONG);
                toast.show();
            } else {
                Toast toast = Toast.makeText(YourActivity.this,
                        "No image saved.", Toast.LENGTH_LONG);
                toast.show();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...