2012-06-29 2 views
7

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

import javax.swing.ImageIcon; 
import javax.swing.Timer; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
public class HitMarker { 

    public static final Image rangeHitMarker = new ImageIcon(HitMarker.class.getResource("rangeHitMarker.png")).getImage(); 
    public static final Image magicHitMarker = new ImageIcon(HitMarker.class.getResource("magicHitMarker.png")).getImage(); 
    public static final Image monsterHitMarker = new ImageIcon(HitMarker.class.getResource("monsterHitMarker.png")).getImage(); 

    public static final Font font = new Font("Tahoma", Font.PLAIN, 10); 

    public static final Color t = new Color(0,0,0,0); 

    public Image hitMarker; 
    public BufferedImage image; 
    public String hit; 

    public int attackStyle; 

    public boolean rangeAttack; 
    public int x; 
    public int y; 

    public Timer timer; 
    public boolean remove; 

    public HitMarker(int x, int y, int hit, int attackStyle){ 
     this.hit = String.format("%d", hit); 
     this.remove = false; 
     this.x = x; 
     this.y = y; 
     this.attackStyle = attackStyle; 
     this.hitMarker = getImage(); 
     BufferedImage bi = new BufferedImage(35, 20, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = bi.createGraphics(); 
     g.drawImage(hitMarker, 0, 0, null); 
     g.setFont(font); 
     g.setColor(Color.WHITE); 
     g.drawString(this.hit, 18, 13); 
     g.dispose(); 
     image = bi; 
     timer = new Timer(800, 
       new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       remove = true; 
       timer.stop(); 
      } 
     } 
     ); 
     timer.setInitialDelay(800); 
     timer.start(); 
    } 

    public HitMarker(int x, int y, int hit){ 
     this.hit = String.format("%d", hit); 
     this.remove = false; 
     this.x = x; 
     this.y = y; 
     this.hitMarker = monsterHitMarker; 
     BufferedImage bi = new BufferedImage(35, 20, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = bi.createGraphics(); 
     g.drawImage(hitMarker, 0, 0, null); 
     g.setFont(font); 
     g.setColor(Color.WHITE); 
     g.drawString(this.hit, 18, 13); 
     g.dispose(); 
     image = bi; 
     timer = new Timer(800, 
       new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       remove = true; 
       timer.stop(); 
      } 
     } 
     ); 
     timer.setInitialDelay(800); 
     timer.start(); 
    } 

    public boolean isRangeAttack(){ 
     return attackStyle == AttackStyleConstants.RANGE || attackStyle == AttackStyleConstants.RANGE_DEFENCE ? true : false; 
    } 

    public Image getImage(){ 
     return isRangeAttack() ? rangeHitMarker : magicHitMarker; 
    } 

} 

Особое внимание уделяется либо конструктору: И ошибка, которую я испытываю, заключается в том, что когда я создаю BufferedImage и рисую изображение на буферизованное изображение, он автоматически создает черный фон, и я не знаю почему. Я пробовал исследовать эту тему, а некоторые говорят, что нужно что-то изменить в отношении метода AlphaComposite и g.clearRect(), но ни один из них не работает. Кстати, изображение, которое я рисую на буферизованном изображении, составляет 35x20 (это размеры буферизованного изображения) и имеет прозрачный фон. Если кто-нибудь скажет мне, как удалить этот черный фон, это было бы очень признательно, спасибо.

+1

для лучшей помощи скорее отправить сообщение [SSCCE] (http://sscce.org/), две причины ---> большинство ответчиков не идут на ссылки третьей стороны, 2) для читателей фьючерсов – mKorbel

+0

Я думал, что был? –

+0

@JoshM Он хотел сказать, что лучше разместить код прямо здесь или просто часть проблемы и ссылку на полный источник, поэтому, если ссылка не работает, ваш вопрос не станет бесполезным в будущем. – Andrew

ответ

16

Пробег: BufferedImage.TYPE_INT_ARGB. Это сделает регионы прозрачными, а не черными.

+0

О, спасибо, это работает. –

+0

, так как у меня такая же проблема, я попробовал выше решение, не работающее для меня, на самом деле я хочу сделать фона светло-серым, а не черным. Может кто-нибудь сказать мне, как это сделать – Lasan

4

Вы можете попытаться сохранить альфа-канал, а также,

BufferedImage bi = new BufferedImage(35, 20, BufferedImage.TYPE_INT_ARGB); 
0

Используйте детские вместо JPEG. Png очень подходит для операций прозрачности. Вот простой фрагмент кода экспорта png;

 BufferedImage bImage = new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = (Graphics2D) bImage.getGraphics(); 
     DrawingContext context = new DrawingContext(g2d); 
     plot.draw(context); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     DrawableWriter wr = DrawableWriterFactory.getInstance().get("image/png"); 

     wr.write(plot, baos, 640, 480); 
     baos.flush(); 

     baos.close(); 
     InputStream inputStream = new ByteArrayInputStream(baos.toByteArray()); 
     BufferedImage bufferedImage = ImageIO.read(inputStream); 

     ImageIO.write(bufferedImage,"png",new File(outputFolder.getPath()+"/result.png")); 
1

Если вам нужен JPG с белый фон, вам нужно нарисовать изображение, как это:

g.drawImage(hitMarker, 0, 0, Color.WHITE, null); 

Таким образом, вы избежать черного фона при переходе от PNG к JPG.

Смежные вопросы