Как измерить изображение Graphics2D с прозрачным дополнением

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

До сих пор я имею следующий код размещен на pastebin.com который делает вычисление хорошо.

Я прочитал много руководств и другого ТАК вопросы напрасно. Я попробовал многочисленные перестановки, заполняется, составные типы, типы изображения, и т.д. Иногда я получаю синий фон, иногда белый, но это никогда, кажется, не прозрачно.

BufferedImage newImg = new BufferedImage(newWidth, newHeight, img.getType());
Graphics2D g = newImg.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, newWidth, newHeight);
g.drawImage(img, x, y, x + scaledWidth, y + scaledHeight, 0, 0,
    currentWidth, currentHeight, Color.WHITE, null);
g.dispose();
return newImg;

Любая идея, что называют Graphics2D, я должен сделать, чтобы иметь Цвет. БЕЛЫЙ фон быть прозрачным и тянут старое изображение по новому? Спасибо за любую помощь.

Отредактируйте:

Оказалось, что проблема, которую я имел, состояла в том, что я пытался произвести прозрачный цвет с изображением JPEG. JPEGs не поддерживают прозрачность. Понятное дело.

3
I' m вполне уверенный, который является одной из вещей, что я попробовал @Eng. Fouad. Если можно быть немного более определенным I' ll испытывают его.
добавлено автор Gray, источник
I' m вполне уверенный, который является одной из вещей, что я попробовал @Eng. Fouad. Если можно быть немного более определенным I' ll испытывают его.
добавлено автор Gray, источник
I' m вполне уверенный, который является одной из вещей, что я попробовал @Eng. Fouad. Если можно быть немного более определенным I' ll испытывают его.
добавлено автор Gray, источник
Кроме того, рассмотрите использование BufferedImage. TYPE_INT_ARGB как тип изображения.
добавлено автор Eng.Fouad, источник
Кроме того, рассмотрите использование BufferedImage. TYPE_INT_ARGB как тип изображения.
добавлено автор Eng.Fouad, источник
Кроме того, рассмотрите использование BufferedImage. TYPE_INT_ARGB как тип изображения.
добавлено автор Eng.Fouad, источник
Вы попытались установить альфа-компонент с новый Цвет (интервал r, интервал g, интервал b, интервал a)?
добавлено автор Eng.Fouad, источник
Кроме того, рассмотрите использование BufferedImage. TYPE_INT_ARGB как тип изображения.
добавлено автор Eng.Fouad, источник
Чему-то нравится новый Цвет (0, 0, 0, 0) .
добавлено автор Eng.Fouad, источник
Вы попытались установить альфа-компонент с новый Цвет (интервал r, интервал g, интервал b, интервал a)?
добавлено автор Eng.Fouad, источник

7 ответы

Я только что испытал его, и это работает.

Просто замените Цвет. БЕЛЫЙ с новый Цвет (0, 0, 0, 0) и img.getType() с BufferedImage. TYPE_INT_ARGB .


BufferedImage img = ImageIO.read(new File("image.png"));
BufferedImage outImage = scaleWithPadding(img, 300, 100);
ImageIO.write(outImage, "png", new File("newImage.png"));

image.png: (204x53)

enter image description here

newImage.png: (300x100)

enter image description here

3
добавлено
Спасибо за это. Какое изображение вы пробовали? Моя проблема это I' m пытающийся преобразовать JPEGs?
добавлено автор Gray, источник
Это было моей проблемой. Большое спасибо за помощь!
добавлено автор Gray, источник
@Gray PNG изображение. <�у кода> JPEG не может быть прозрачности в нем.
добавлено автор Eng.Fouad, источник

Я только что испытал его, и это работает.

Просто замените Цвет. БЕЛЫЙ с новый Цвет (0, 0, 0, 0) и img.getType() с BufferedImage. TYPE_INT_ARGB .


BufferedImage img = ImageIO.read(new File("image.png"));
BufferedImage outImage = scaleWithPadding(img, 300, 100);
ImageIO.write(outImage, "png", new File("newImage.png"));

image.png: (204x53)

enter image description here

newImage.png: (300x100)

enter image description here

3
добавлено
Это было моей проблемой. Большое спасибо за помощь!
добавлено автор Gray, источник
Спасибо за это. Какое изображение вы пробовали? Моя проблема это I' m пытающийся преобразовать JPEGs?
добавлено автор Gray, источник
@Gray PNG изображение. <�у кода> JPEG не может быть прозрачности в нем.
добавлено автор Eng.Fouad, источник

Я только что испытал его, и это работает.

Просто замените Цвет. БЕЛЫЙ с новый Цвет (0, 0, 0, 0) и img.getType() с BufferedImage. TYPE_INT_ARGB .


BufferedImage img = ImageIO.read(new File("image.png"));
BufferedImage outImage = scaleWithPadding(img, 300, 100);
ImageIO.write(outImage, "png", new File("newImage.png"));

image.png: (204x53)

enter image description here

newImage.png: (300x100)

enter image description here

3
добавлено
Это было моей проблемой. Большое спасибо за помощь!
добавлено автор Gray, источник
Спасибо за это. Какое изображение вы пробовали? Моя проблема это I' m пытающийся преобразовать JPEGs?
добавлено автор Gray, источник
@Gray PNG изображение. <�у кода> JPEG не может быть прозрачности в нем.
добавлено автор Eng.Fouad, источник

Я только что испытал его, и это работает.

Просто замените Цвет. БЕЛЫЙ с новый Цвет (0, 0, 0, 0) и img.getType() с BufferedImage. TYPE_INT_ARGB .


BufferedImage img = ImageIO.read(new File("image.png"));
BufferedImage outImage = scaleWithPadding(img, 300, 100);
ImageIO.write(outImage, "png", new File("newImage.png"));

image.png: (204x53)

enter image description here

newImage.png: (300x100)

enter image description here

3
добавлено
Это было моей проблемой. Большое спасибо за помощь!
добавлено автор Gray, источник
Спасибо за это. Какое изображение вы пробовали? Моя проблема это I' m пытающийся преобразовать JPEGs?
добавлено автор Gray, источник
@Gray PNG изображение. <�у кода> JPEG не может быть прозрачности в нем.
добавлено автор Eng.Fouad, источник

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

Вот мой окончательный код:

public BufferedImage getTransparentScaledImage(BufferedImage originalImage, int finalWidth, int finalHeight) {
    int originalWidth = originalImage.getWidth();
    int originalHeight = originalImage.getHeight();

    int newWidth;
    int newHeight;
    if (originalWidth == 0 || originalHeight == 0
            || (originalWidth == finalWidth && originalHeight == finalHeight)) {
        return originalImage;
    }

    double aspectRatio = (double) originalWidth/(double) originalHeight;
    double boundaryAspect = (double) finalWidth/(double) finalHeight;

    if (aspectRatio > boundaryAspect) {
        newWidth = finalWidth;
        newHeight = (int) Math.round(newWidth/aspectRatio);
    } else {
        newHeight = finalHeight;
        newWidth = (int) Math.round(aspectRatio * newHeight);
    }

    int xOffset = (finalWidth - newWidth)/2;
    int yOffset = (finalHeight - newHeight)/2;

    LoggerManager.getInstance().debug("frontoffice",
            "Image Servlet: [" + xOffset + "] [" + yOffset + "] [" + newWidth + "] [" + newHeight + "] [" + originalWidth + "] [" + originalHeight + "] [" + finalWidth + "] [" + finalHeight + "]");

    BufferedImage intermediateImage = new BufferedImage(finalWidth, finalHeight, BufferedImage.TYPE_INT_RGB);
    Graphics2D gi = intermediateImage.createGraphics();
    gi.setComposite(AlphaComposite.SrcOver);
    gi.setColor(Color.WHITE);
    gi.fillRect(0, 0, finalWidth, finalHeight);
    gi.drawImage(originalImage, xOffset, yOffset, xOffset + newWidth, yOffset + newHeight, 0, 0, originalWidth, originalHeight, Color.WHITE, null);
    gi.dispose();

    //if image from db already had a transparent background, it becomes black when drawing it onto another
    //even if we draw it onto a transparent image
    //so we set it to a specific color, in this case white
    //now we have to set that white background transparent
    Image intermediateWithTransparentPixels = makeColorTransparent(intermediateImage, Color.WHITE);

    //finalize the transparent image
    BufferedImage finalImage = new BufferedImage(finalWidth, finalHeight, BufferedImage.TYPE_INT_ARGB);
    Graphics2D gf = finalImage.createGraphics();
    gf.setComposite(AlphaComposite.SrcOver);
    gf.setColor(new Color(0, 0, 0, 0));
    gf.fillRect(0, 0, finalWidth, finalHeight);
    gf.drawImage(intermediateWithTransparentPixels, 0, 0, finalWidth, finalHeight, new Color(0, 0, 0, 0), null);
    gf.dispose();

    return finalImage;
}

public static Image makeColorTransparent(Image im, final Color color) {
    ImageFilter filter = new RGBImageFilter() {
       //the color we are looking for... Alpha bits are set to opaque
        public int markerRGB = color.getRGB() | 0xFF000000;

        public final int filterRGB(int x, int y, int rgb) {
            if ((rgb | 0xFF000000) == markerRGB) {
               //Mark the alpha bits as zero - transparent
                return 0x00FFFFFF & rgb;
            } else {
               //nothing to do
                return rgb;
            }
        }
    };

    ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
    return Toolkit.getDefaultToolkit().createImage(ip);
}
3
добавлено
Спасибо u много, вы действительно решили мою проблему, которая заблокировала меня в течение долгого времени ~
добавлено автор Mr rain, источник

Я осуществил упомянутые решения (или очень похожий) просто обращают внимание, если вы не используете

graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON;

ваши изображения будут произведены с очень низким качеством (из-за вычисления)

0
добавлено

Ваш оригинал drawImage() у метода не было прозрачного фона, потому что Цвет фона использовался. Замените следующим:

 g.drawImage(img, x, y, x + scaledWidth, y + scaledHeight, 0, 0, currentWidth, currentHeight, null);
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

CSS — русскоговорящее сообщество
CSS — русскоговорящее сообщество
1 502 участник(ов)

Сообщество любителей CSS Возникли проблемы с CSS? – пиши сюда, обсудим и предложим самое лучшее решение Работа: @css_ru_jobs Правила: https://teletype.in/@css_ru/r1EWtQ2w7 Приходите в наши чаты @javascript_ru и @frontend_ru Флуд: @css_flood

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async

css_jobs
css_jobs
26 участник(ов)

Чат для вопросов по css и html: @css_ru Флуд: @css_flood Канал с вакансиями и резюме: @css_jobs_feed

css_флуд
css_флуд
10 участник(ов)