Как создать белую рамку вокруг растрового изображения?

#android #bitmap

#Android #растровое изображение

Вопрос:

Например, я хочу белую рамку размером 10 пикселей вокруг всех 4 сторон растрового изображения. Я не использую это для просмотра изображений, в настоящее время я использую этот код для обрезки изображения. Могу ли я узнать, как я мог бы добавить к нему белую рамку?

 public Bitmap scaleCenterCrop(Bitmap source, int newHeight, int newWidth) {
    int sourceWidth = source.getWidth();
    int sourceHeight = source.getHeight();

    // Compute the scaling factors to fit the new height and width, respectively.
    // To cover the final image, the final scaling will be the bigger 
    // of these two.
    float xScale = (float) newWidth / sourceWidth;
    float yScale = (float) newHeight / sourceHeight;
    float scale = Math.max(xScale, yScale);

    // Now get the size of the source bitmap when scaled
    float scaledWidth = scale * sourceWidth;
    float scaledHeight = scale * sourceHeight;

    // Let's find out the upper left coordinates if the scaled bitmap
    // should be centered in the new size give by the parameters
    float left = (newWidth - scaledWidth) / 2;
    float top = (newHeight - scaledHeight) / 2;

    // The target rectangle for the new, scaled version of the source bitmap will now
    // be
    RectF targetRect = new RectF(left, top, left   scaledWidth, top   scaledHeight);

    // Finally, we create a new bitmap of the specified size and draw our new,
    // scaled bitmap onto it.
    Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig());
    Canvas canvas = new Canvas(dest);
    canvas.drawBitmap(source, null, targetRect, null);

    return dest;
}
  

Ответ №1:

Я написал функцию для этого:

 private Bitmap addWhiteBorder(Bitmap bmp, int borderSize) {
    Bitmap bmpWithBorder = Bitmap.createBitmap(bmp.getWidth()   borderSize * 2, bmp.getHeight()   borderSize * 2, bmp.getConfig());
    Canvas canvas = new Canvas(bmpWithBorder);
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(bmp, borderSize, borderSize, null);
    return bmpWithBorder;
}
  

По сути, он создает новое растровое изображение, добавляя 2 * размер границы к каждому измерению, а затем рисует поверх него исходное растровое изображение, компенсируя его размером границы.

Комментарии:

1. Это работает, когда размер imageview превышает отображаемый размер изображения, и обычный метод для границ с фоном и заполнением не срабатывает, поскольку некоторые части заполнены больше, чем другие. Этот метод идеален. слава.

2. идеальный код. Размер границы должен быть плавающим, чтобы использоваться в методе drawBitmap()

3. Это кажется границей холста, а не границей растрового изображения, нужен ли холст для каждого растрового изображения? Что, если мой холст занимает весь экран с несколькими растровыми изображениями на нем?

Ответ №2:

Что касается способа сделать это. Вы делаете свое растровое изображение больше, чем то, которое вы к нему добавляете, а затем заполняете холст нужным фоном. Если вам нужно добавить другие эффекты, вы можете посмотреть в настройках canvas для обрезки прямоугольника, добавления закругленных углов и тому подобного.

 RectF targetRect = new RectF(left 10, top 10, left   scaledWidth, top   scaledHeight);
Bitmap dest = Bitmap.createBitmap(newWidth 20, newHeight 20, source.getConfig());
Canvas canvas = new Canvas(dest);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(source, null, targetRect, null);
  

Комментарии:

1. не работает. белая рамка изображения не отображается с 4 стороны. только граница для верха и низа

2. что ж, у вас есть основная идея, поиграйте с targetRect и размером растрового изображения, чтобы получить желаемый эффект.

Ответ №3:

Вы можете нарисовать 4 прямоугольника после того, как раскрасите содержимое вашего растрового изображения.

 point 0,0,3,sizey
point 0,0,sizex,3
point 0,sizey-3,sizex,sizey
point sizex-3,0,sizex,sizey
  

Ответ №4:

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

лучший способ достичь этой цели — использовать метод Canvas #DrawLine, подобный следующему коду:

     Bitmap drawBorder(Bitmap source) {
    int width = source.getWidth();
    int height = source.getHeight();
    Bitmap bitmap = Bitmap.createBitmap(width, height, source.getConfig());
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();
    paint.setStrokeWidth(50);
    paint.setColor(Color.WHITE);

    canvas.drawLine(0, 0, width, 0, paint);
    canvas.drawLine(width, 0, width, height, paint);
    canvas.drawLine(width, height, 0, height, paint);
    canvas.drawLine(0, height, 0, 0, paint);
    canvas.drawBitmap(source, 0, 0, null);

    return bitmap;
        }
  

таким образом, мы сначала создаем второе растровое изображение, используя ширину, высоту и конфигурацию исходного растрового изображения, и используем drawline () mathod четыре раза, чтобы нарисовать четыре линии, используя координаты конечных точек каждой линии вокруг второго растрового изображения, а затем рисуем исходное растровое изображение на втором растровом изображении, которое должно быть возвращено.

Комментарии:

1. целевое растровое изображение не обязательно является квадратным, граница должна соответствовать форме растрового изображения.

Ответ №5:

Очень простым способом сделать это было бы установить фон ImageView на белый и добавить значение заполнения.

Если это не сработает, создайте FrameLayout с w / h wrap_content , установите для него белый фон, поместите туда ImageView и установите поля ImageView на желаемую ширину границы.

Ответ №6:

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

Комментарии:

1. привет, можешь показать мне, как это делается? я пытаюсь понять, как нарисовать белую копию изображения

2. Вам нужна рамка вокруг квадратного растрового изображения? Если это так, просто нарисуйте за ним другое квадратное растровое изображение

3. Это просто canvas.drawRect, если вы используете Canvas API.

Ответ №7:

Вы можете создать свой targetRectangle на 20 пикселей шире и на 20 пикселей выше

 RectF targetRect = new RectF(left, top, left   scaledWidth   20, top   scaledHeight   20);
  

и покрасить фон в белый цвет

Комментарии:

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

Ответ №8:

Попробуйте это, это также добавит границу вашему холсту

     canvas.drawLine(0, 0, canvas.getWidth(), 0, paint2);
        canvas.drawLine(0, 0, 0, canvas.getHeight(), paint2);
        canvas.drawLine(0, canvas.getHeight(), canvas.getWidth(),
                canvas.getHeight(), paint2);
        canvas.drawLine(canvas.getWidth(), 0, canvas.getWidth(),
                canvas.getHeight(), paint2);