2012-06-29 22 views
7

yüzden bir oyun yapıyorum ve ben üzerinde metin ekleyerek orijinal isabet işaretleyici görüntüsünü değiştirmeye çalışıyorum ve aşağıdaki kodu kullanıyorum:BufferedImage üreten Tamam siyah arka plan

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; 
    } 

} 

Özellikle yapıcı üzerinde odaklama: Ve şu an sahip olduğum hata BufferedImage'ı oluşturduğumda ve görüntüyü tamponlu görüntüde çizdiğimde, otomatik olarak siyah bir arka plan oluşturuyor ve nedenini bilmiyorum. Bu konuda araştırma yapmayı denedim ve bazıları AlphaComposite ve g.clearRect() yöntemiyle ilgili bir şeyleri değiştirmeyi söylüyor, ancak bunların hiçbiri işe yaramıyor. Bu arada, tamponlu görüntü üzerinde boyadığım görüntü 35x20 (tamponlu görüntünün boyutlarıdır) ve şeffaf bir arka plana sahiptir. Bu siyah arka planın nasıl kaldırılacağını bana söyleyebilirseniz, çok memnun olurum, teşekkürler.

+1

Daha iyi yardım almak için bir [SSCCE] (http://sscce.org/), iki nedeni ---> en çok yanıt verenler 3. taraf bağlantılarına gitmiyor, 2) futures okuyucular için – mKorbel

+0

sanıyordum? –

+0

@JoshM Demek istediğim, kodu doğrudan buraya ya da yalnızca sorun kısmına ve tam kaynağın bir bağlantısına göndermek daha iyidir, bu yüzden eğer bağlantı öldüğünde, sorunuz gelecekte işe yaramaz hale gelmeyecektir. – Andrew

cevap

16

BufferedImage.TYPE_INT_ARGB'u deneyin. Bu bölgeleri siyah yerine şeffaf hale getirecek. Sen denemek ve aynı zamanda alfa kanalı saklamak isteyebilirsiniz

+0

Ah oldu, teşekkürler. –

+0

Ben aynı sorun yaşıyorum çünkü benim için işe yaramadı çözüm yukarıda çalıştı, aslında ben arka plan açık gri yerine siyah yapmak istiyorum. Birisi bana bunu nasıl yapacağımı söyleyebilir mi? – Lasan

4

yerine jpeg ait png

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

kullanın. Png şeffaflık işlemleri için çok uygundur. İşte basit png ihracat kodu snippet'i; Eğer bir JPGbeyaz arka planı gerekiyorsa

 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

, böyle bir görüntü çizmek gerekir: JPG için PNG geçerken

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

Bu şekilde siyah bir arka plan kaçının.