наложение изображений в java

Надеюсь, вы можете дать мне несколько советов, чтобы решить мою проблему. Мне нужно наложить много изображений на кнопку. Но проблема в том, это базовое изображение (зуб): (http://i.imgur.com/7tIcP.gif)

мое первое изображение: http://i.imgur.com/FYuD8.gif и затем я сказал: http://i.imgur.com/mWz9c.gif первое изображение перекрывает второе, поэтому я просто вижу только второе изображение ...

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

мой код:

    BufferedImage large=null;
    large = ImageIO.read(new File("firstimage.gif"));

    BufferedImage small=null;

    small = ImageIO.read(new File("secondimage.gif"));

    int w = Math.max(large.getWidth(), small.getWidth());
    int h = Math.max(large.getHeight(), small.getHeight());

    BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

   //paint both images, preserving the alpha channels
    Graphics g = combined.getGraphics();
    g.drawImage(large, 0, 0, null);
    g.drawImage(small, 0, 0, null);

    ImageIO.write(combined, "PNG", new File("twoInOne.png"));

    ImageIcon icon1 = new ImageIcon(combined);
    jbutton1.setIcon(icon1);

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

Теперь я загрузил 3 изображения: я пропустил базовое изображение (зуб), потому что я не думаю, что это проблема.

2
nl ja de
Freezerburn понимает цель ... первое изображение нуждается в наложении второго изображения без перекоса первого изображения ...
добавлено автор Alejandro Cabano, источник
мм ... Я не понимаю ... ссылки, которые я опубликовал, - это просто примеры ... мои исходные изображения находятся в формате .gif
добавлено автор Alejandro Cabano, источник
точно ... так что моя проблема в том, что когда я ставлю второй ... просто перезаписать синий накладной
добавлено автор Alejandro Cabano, источник
Мне нужно это subefotos.com/ver/?7cd9a71926ca04e6bebe6a4986df8ba2o.jpg посмотреть
добавлено автор Alejandro Cabano, источник
Почему код содержит GIF, а оба изображения - JPG?
добавлено автор Andrew Thompson, источник
Когда пользователь хочет обоим, что означает предполагается ? Как это будет выглядеть?
добавлено автор Andrew Thompson, источник
Таким образом, части изображения 2, которые не являются полностью прозрачными (например, синий/красный), должны быть полупрозрачными?
добавлено автор Andrew Thompson, источник

3 ответы

Мне нужно отредактировать мои изображения, чтобы получить прозрачный фон?

Чтобы сделать определенный цвет прозрачным, вы можете выполнять итерацию через пиксели BufferedImage или использовать подходящий LookupOp . Для последнего см. Статьи, приведенные в здесь . Затем вы можете комбинировать изображения, используя drawImage() . Композитное правило по умолчанию, AlphaComposite.SRC_OVER , должно быть удовлетворительным; если нет, вы можете изменить его, как показано здесь .

3
добавлено
это работает! теперь я могу поместить 3 изображения вместе, спасибо вам, trashgod.
добавлено автор Alejandro Cabano, источник

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

Решение, которое вы, вероятно, хотите для этого, состоит в том, чтобы разбить различные части, которые вы хотите наложить друг на друга, на отдельные, более мелкие изображения. С вашими изображениями, похоже, вы хотите иметь различные накладки поверх зуба, чтобы отображать различные фрагменты информации. В этом случае вам понадобятся три вещи: изображение зуба, изображение с красным наложением и изображение, содержащее синий оверлей. Все три изображения должны иметь прозрачный, а не белый фон, чтобы они не перезаписывали цвета в любом ранее нарисованном изображении. Когда вы сделаете это, вы захотите нарисовать зуб, затем наложите 1 (красный/синий), затем наложите 2 (красный/синий). Это должно дать вам результат, который вы ищете.

1
добавлено
Зависит от того, работаете ли вы в Windows, Mac или Linux. Вам нужно получить редактор изображений и удалить белый фон, а затем сохранить его как PNG (что обеспечивает прозрачность изображения). Windows вы можете использовать Paint.NET, Mac, вы можете использовать SeaShore, и единственной программой, которую я знаю для Linux, является GIMP, который является заменой Photoshop, поэтому это довольно сложно.
добавлено автор Freezerburn, источник
m ... Если Im wrong вы скажете мне, что мне нужно отредактировать мои изображения, чтобы получить прозрачный фон? на самом деле проблема заключается в образах?
добавлено автор Alejandro Cabano, источник
"на самом деле проблема - это изображения?" Вы утверждаете, что они GIF, которые поддерживают «прозрачность» или нет. Изображения на этом сайте являются JPEG, что не поддерживает прозрачность в любой форме. Только PNG поддерживает частичную прозрачность и подходит для прямого рисования одного над другим, чтобы видеть части обоих одновременно. Возможно, вы должны повторно загрузить изображения в imgur.com , чтобы мы могли их правильно увидеть.
добавлено автор Andrew Thompson, источник

Ключ должен установить значение альфа-значения для float, например, два слоя, установить альфа-значение 0,5, три слоя, установить альфа-0,33, четыре слоя, установить альфа-0,25 ... В любом случае, вот пример кода

try
{
    BufferedImage imgA = ImageIO.read(new File(imgAPath, token));
    BufferedImage imgB = ImageIO.read(new File(imgBPath, token));

    if (imgA.getWidth() == imgB.getWidth() && imgA.getHeight() == imgB.getHeight()) 
    {
        float alpha = 0.5f;
        int compositeRule = AlphaComposite.SRC_OVER;
        AlphaComposite ac;
        int imgW = imgA.getWidth();
        int imgH = imgA.getHeight();
        BufferedImage overlay = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = overlay.createGraphics();
        ac = AlphaComposite.getInstance(compositeRule, alpha);
        g.drawImage(imgA,0,0,null);
        g.setComposite(ac);
        g.drawImage(imgB,0,0,null);
        g.setComposite(ac);
        ImageIO.write(overlay, "PNG", new File(logFolder, browser+"__"+token));
        g.dispose();
    }
    else
    {
        System.err.println(token+" dymension not match ");
    }
}
catch (IOException e)
{
}
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 участник(ов)