2012-06-29 46 views
7

Được rồi vì vậy tôi làm cho một trò chơi, và tôi đang cố gắng để thay đổi hình ảnh hit marker ban đầu bằng cách thêm văn bản trên nó, và tôi đang sử dụng đoạn mã sau:BufferedImage sản xuất màu đen nền

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

} 

Tập trung đặc biệt vào một trong hai hàm tạo: Và lỗi mà tôi gặp phải là khi tạo BufferedImage và vẽ hình ảnh trên hình ảnh đệm, nó tạo ra một nền đen tự động và tôi không biết tại sao. Tôi đã cố gắng nghiên cứu về chủ đề này và một số nói để thay đổi một cái gì đó về AlphaComposite và phương pháp g.clearRect(), nhưng không phải của những người dường như làm việc. Nhân tiện, hình ảnh tôi vẽ trên ảnh đệm là 35x20 (là kích thước của hình ảnh được đệm) và nó có nền trong suốt. Nếu bất cứ ai có thể cho tôi biết làm thế nào để loại bỏ nền đen này, nó sẽ được rất nhiều đánh giá cao, cảm ơn bạn.

+1

để được trợ giúp tốt hơn sớm hơn đăng một [SSCCE] (http://sscce.org/), hai lý do ---> hầu hết người trả lời không tham gia liên kết bên thứ 3, 2) cho người đọc tương lai – mKorbel

+0

Tôi nghĩ tôi là? –

+0

@JoshM Anh ấy muốn nói, tốt hơn là đăng mã trực tiếp ở đây, hoặc chỉ là phần vấn đề và liên kết tới nguồn đầy đủ, vì vậy nếu liên kết bị chết, câu hỏi của bạn sẽ không trở thành vô ích trong tương lai. – Andrew

Trả lời

16

Hãy thử BufferedImage.TYPE_INT_ARGB. Điều này sẽ làm cho các vùng trong suốt thay vì màu đen.

+0

Oh cảm ơn, nó hoạt động. –

+0

kể từ khi tôi gặp vấn đề tương tự tôi đã thử giải pháp trên không làm việc cho tôi, thực sự tôi muốn làm cho nền màu xám nhạt thay vì màu đen. Một số người có thể cho tôi biết cách thực hiện điều đó – Lasan

4

Bạn có thể muốn thử và lưu trữ các kênh alpha là tốt,

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

Sử dụng png thay vì jpeg. Png phù hợp cho hoạt động minh bạch. Đây là đoạn mã xuất khẩu png đơn giản;

 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

Nếu bạn cần một JPG với trắng nền, bạn cần phải rút ra những hình ảnh như thế này:

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

Bằng cách này bạn tránh được những nền đen khi đi PNG-JPG.

Các vấn đề liên quan