9
votes

BuffereDimage produisant fond noir

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

}


3 commentaires

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.


4 Réponses :


19
votes

Essayez bufferedimage.type_int_argb . Cela rendra les régions transparentes au lieu de noir.


1 commentaires

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



4
votes

Vous voudrez peut-être essayer de stocker également le canal alpha,

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


0 commentaires

0
votes

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"));


0 commentaires

1
votes

Si vous avez besoin d'un jpg avec blanc , vous devez dessiner l'image comme ceci: xxx

de cette façon, vous éviterez Le fond noir lorsqu'il va de png à jpg .


0 commentaires