Java как наложить одно изображение на другое
Перейти к содержимому

Java как наложить одно изображение на другое

  • автор:

How to draw an image over another image?

I have a Java project that’s about traffic network simulation in a random city, I’ve managed to figure out a way to implement this project, so I divided each intersection into a section which is basically an extended JPanel class (named Carrefour). everything works well until I got stuck with how to draw vehicles and make them pass through roads.

So my problem is how to draw an image (vehicle image) over an another image (road)?

Andrew Thompson's user avatar

2 Answers 2

Another approach that does not require extending components.

enter image description here

Andrew Thompson's user avatar

If this is Swing, then draw the background image in a BufferedImage. Display this BufferedImage in a JComponent’s (such as a JPanel’s) paintComponent method using Graphic’s drawImage(. ) method, and then draw the changing images over this in the same paintComponent method. Don’t forget to call the super.paintComponent(. ) method first though.

Please note that this question has been asked quite a bit here and elsewhere, and as you would expect, there are lots of examples of this sort of thing that you can find here with a bit of searching.

Edit
You ask:

Thanks, this is how I draw the firt image (road)

Русские Блоги

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

Посмотрите на эффект:
Большая картина — это черный фоновый картинка, а маленькая картина — настольный скриншот этого слова

Интеллектуальная рекомендация

STR внутренний метод

Код результат Перепечатано: https://www.cnblogs.com/kamil/p/5160990.html.

Сортировка кучи

Сортировка кучи Временная сложность построения кучи равна O (n), а временная сложность первой корректировки кучи равна O (logi), поэтомуВ любом случае сложность времени O (nlogn)。 Идея алгоритма: Снач.

Не могу найти my.cnf

Первый шаг — проверить, есть ли Второй шаг, если нет Третий шаг — проверить место установки mysql. ps: можно найти несколько путей, вы просто видитеshareиз Шаг 4 Найдите файл с суффиксом .cnf Нескольк.

EasyAr4 одновременно использует несколько разреженных космических карт

Картинка космического пространства Easyar4 поддерживает одновременное загрузку множественного разреженного пространства карт и используется. Многократные карты космического пространства на самом деле .

Настройки контрольной точки вторичного примера

1. Как правило, вторичный документ выполняет контрольную точку каждый час, объединяет редактирование прокрутки с помощью FSImage. 2.Одна минутаПроверьте количество операций, когда количество операций .

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

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

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

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

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

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

3 ответа

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

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

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

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

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

Совмещение изображений

Java 2DTM API обеспечивает поддержку совмещения нескольких изображений при помощи так называемых правил Porter-Duff. Приведенные первоначально в документе SIGGRAPH от 1984 «Композиция цифровых изображений» Thomas Porter и Tom Duff, эти правила описывают, как скомбинировать содержимое нескольких изображений, если одно изображение рисуется поверх второго.

Таких правил двенадцать. Они включают такие правила, как «нарисовать только исходное изображение» и «нарисовать часть другого изображения, которое не перекрывает исходного». На первый взгляд некоторые из этих правил могут показаться сложными. Однако это не так. Если вы посмотрите на картинку, вещи станут намного понятнее.

В Java 2D API правила совмещения поддерживаются классом AlphaComposite. Этот класс предоставляет двенадцать констант, по одной для каждого правила. Для изменения настройки в метод setComposite класса Graphics2D передается конкретная константа. Затем, при выводе изображения связанное с константой правило используется для совмещения нового изображения с существующим содержимым. Java 2D API поддерживает объекты AlphaComposite с частичной прозрачностью. Если вы хотите медленно наложить одно изображение на другое, вы можете изменить процент прозрачности так, что новое изображение будет появляться или исчезать в зависимости от используемого правила совмещения.

Ниже перечислены двенадцать констант и связанные с ними правила:

Правила визуализации и пример

Для того, чтобы помочь вам визуализировать двенадцать правил, в этой статье используется программа, совмещающая изображения. Программа взята из книги «Овладение Java 2, J2SE 1.4» John Zukowski, опубликованная Sybex. Программа отображает экран, используя все двенадцать правил. В этой программе каждое правило применяется с тремя различными установками процента прозрачности исходного и нового изображений. Исходное изображение представляет собой зеленый треугольник слева. Новое изображение — это пурпурный треугольник справа. Два треугольника перекрываются в середине.

На экране программы находятся два набора рисунков. Первый верхний набор использует настройки совмещения CLEAR, DST, DST_ATOP, DST_IN, DST_OUT и DST_OVER. Нижний набор использует SRC, SRC_ATOP, SRC_IN, SRC_OUT, SRC_OVER и XOR.

Программа предназначена только для демонстрации различных правил. Как реально совместить изображения, будет вскоре объяснено.

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.*;

public class CompositeIt extends JFrame <
  int rules [] = < AlphaComposite.CLEAR, AlphaComposite.DST,
      AlphaComposite.DST_ATOP, AlphaComposite.DST_IN,
      AlphaComposite.DST_OUT, AlphaComposite.DST_OVER,
      AlphaComposite.SRC, AlphaComposite.SRC_ATOP, AlphaComposite.SRC_IN,
      AlphaComposite.SRC_OUT, AlphaComposite.SRC_OVER, AlphaComposite.XOR > ;
  float percents [] = < .33f , .67f , 1.0f >;
  BufferedImage source, dest;
  GeneralPath sourcePath, destPath;

  public CompositeIt () <
    sourcePath = new GeneralPath () ;
    sourcePath.moveTo ( 0 , 0 ) ;
    sourcePath.lineTo ( 50 , 0 ) ;
    sourcePath.lineTo ( 50 , 25 ) ;
    sourcePath.closePath () ;
    source = new BufferedImage ( 80 , 30 , BufferedImage.TYPE_INT_ARGB ) ;
    destPath = new GeneralPath () ;
    destPath.moveTo ( 25 , 0 ) ;
    destPath.lineTo ( 75 , 0 ) ;
    destPath.lineTo ( 25 , 25 ) ;
    destPath.closePath () ;
    dest = new BufferedImage ( 80 , 30 , BufferedImage.TYPE_INT_ARGB ) ;
  >

  public static void main ( String args []) <
    JFrame f = new CompositeIt () ;
    f.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE ) ;
    f.setTitle ( "CompositeIt" ) ;
    f.setSize ( 525 , 275 ) ;
    f.show () ;
  >
>

Вот совмещенное изображение, отображаемое программой:

Совмещение изображений в оперативной памяти

Можно совместить изображения в оперативной памяти, а не с использованием текущего контекста Graphics экрана. При применении объекта BufferedImage для двойной буферизации в буфер отображается одно изображение. Затем отображается второе изображение на первом с применением желаемого правила. И, наконец, комбинированное изображение отображается на экране. Вот пример этого подхода:

// Создать буфер изображения в оперативной памяти
  BufferedImage dest = new BufferedImage (
  width, height,
  BufferedImage.TYPE_INT_ARGB ) ;

  // Получить контекст Graphics
  Graphics2D destG = dest.createGraphics () ;

  // Отобразить первое изображение в нем
  destG.drawImage ( image1, 0 , 0 , this ) ;

  // Скомбинировать их
  destG.setComposite ( mode ) ;
  destG.drawImage ( source, 0 , 0 , this ) ;

  // Отобразить изображение на экране
  g2d.drawImage ( dest, 0 , 0 , this ) ;

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

Постепенное исчезновение изображения

Для получения постепенного исчезновения изображения становится необходимым отображение исходного и нового изображений с изменяемым процентом прозрачности. Класс AlphaComposite предоставляет метод getInstance, дающий возможность указать правило Porter-Duff и процент прозрачности для операций отображения. Применяя операцию отображения, можно эффективно устанавливать в изображении различную степень прозрачности. Затем, после отображения двух изображений одного поверх другого можно получить эффект исчезновения путем изменения степени прозрачности.

В следующей программе демонстрируется эта возможность и выполняется плавное превращение изображения дилижанса:

в крытый автомобиль:

Вы можете взять изображения с сайта Cowboy Clip Art или свои собственные. Изображение автомобиля находится в файле saloon.gif, дилижанса — oldstage.gif. В программе используется TimerTask и Timer для цикла по фиксированному набору шагов вывода изображений. Можете свободно менять значение STEPS для изменения этого счетчика, или значение SLEEP_DELAY для изменения скорости смен изображений. Чем больше значение SLEEP_DELAY, тем дольше время между шагами.

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.Timer;
import java.util.TimerTask;

public class Converge extends JFrame <

  ImageIcon saloonIcon = new ImageIcon ( "saloon.gif" ) ;
  ImageIcon coachIcon = new ImageIcon ( "oldstage.gif" ) ;
  Image saloon = saloonIcon.getImage () ;
  Image coach = coachIcon.getImage () ;

  float sourcePercentage = 1 , destinationPercentage = 0 ;
  private static int STEPS = 100 ;
  private static float STEP_CHANGE = 1.0f / STEPS;
  private static int SLEEP_DELAY = 100 ;

  public void paint ( Graphics g ) <
    if ( insets == null ) <
      insets = getInsets () ;
    >
    g.translate ( insets.left, insets.top ) ;
    Graphics2D g2d = ( Graphics2D ) g;
    Graphics2D destG = dest.createGraphics () ;

    destG.setComposite ( AlphaComposite.getInstance ( AlphaComposite.SRC,
        sourcePercentage )) ;
    destG.drawImage ( coach, 0 , 0 , this ) ;
    destG.setComposite ( AlphaComposite.getInstance ( AlphaComposite.XOR,
        destinationPercentage )) ;
    destG.drawImage ( saloon, 0 , 0 , this ) ;
    g2d.drawImage ( dest, 0 , 0 , this ) ;
  >

  public static void main ( String args []) <
    new Converge () .show () ;
  >
>

Вот копия экрана совмещенных изображений, которые отображает программа:

Ссылки и дополнительная информация

Платформа Java 1.4 включает несколько графических новшеств, относящихся к Java 2D API. Описание этих новшеств находится в статье «Улучшения производительности графики в Java 2 SDK, версия 1.4».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *