D'accord, donc je fais une partie, et j'essaie de modifier l'image de marqueur d'origine d'origine en ajoutant du texte dessus et j'utilise le code suivant:
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; } }
4 Réponses :
Essayez bufferedimage.type_int_argb code>. Cela rendra les régions transparentes au lieu de noir. P>
Depuis que j'ai le même problème que j'ai essayé au-dessus de la solution ne fonctionne pas pour moi, je veux en fait faire des arrière-plan gris clair au lieu de noir. Quelqu'un peut-il me dire comment faire ça aussi
Vous voudrez peut-être essayer de stocker également le canal alpha,
BufferedImage bi = new BufferedImage(35, 20, BufferedImage.TYPE_INT_ARGB);
Utilisez PNG au lieu de JPEG. PNG convient très bien aux opérations de transparence. Voici une simple extrait de code d'exportation 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"));
Si vous avez besoin d'un de cette façon, vous éviterez Le fond noir lorsqu'il va de jpg code> avec
png code> à
jpg code>. p> p>
Pour une meilleure aide plus tôt après un SSCCE , deux raisons ---> La plupart des intervenants ne vont pas au 3ème lien latéral, 2 ) Pour les lecteurs à terme
@Joshm il voulait dire dire, il est préférable de poster le code directement ici, ou juste la partie problématique et un lien vers la source complète, donc si le lien est mort, votre question ne deviendra pas inutile à l'avenir.
Oh je vois, je suis désolé pour tout inconvénient que j'aurais pu causer. Eh bien, le problème est particulièrement dans l'un ou l'autre constructeur (où je crée réellement la bufferedImage) et je pensais qu'il serait bon de montrer tout le code (compte tenu de ses <100 lignes) pour plus d'informations. Mais je suppose que cela irait bien pour montrer que le constructeur.