Probleem met gif met transparante achtergrond

Ik heb een probleem met het weergeven van mijn gif met een transparante achtergrond omdat wanneer ik dit programma start, mijn gif wordt weergegeven, maar alle afbeeldingen van gif op het canvas blijven. Weet iemand een oplossing, alstublieft?

voer hier afbeeldingsbeschrijving invoer hier de afbeeldingsbeschrijving in

Dit is mijn code:

package zkouska3;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class mainl extends JFrame{
    private Image TestImage;
    private BufferedImage bf;
    public static void main(String[] args) {
        new mainl();
    }
    public mainl() {
        setSize(500, 500);
        imageLoader();
        setVisible(true);
    }
    public void imageLoader() {
        try {
            TestImage = new ImageIcon(this.getClass().getResource("pandulak.gif")).getImage();
        }catch(Exception e) {
        }
    }
    @Override
    public void paint(Graphics g){
         g.drawImage(TestImage, 0, 0, 300, 300, this);
}
}

Antwoord 1

hier nog een Hoe .gif te repareren met beschadigd alfakanaal (vastgelopen pixels) verzameld met Graphicsmagick?

Je gif is disposal = 3, wat betekent dat het een eerdere afbeelding nodig heeft omdat het incrementeel wordt weergegeven. Het probleem is dat de afbeelding een zwarte achtergrond heeft en geen witte …

Dit zijn de mogelijke desinvesteringen:

    if (disposal==0) s="no animation";
else if (disposal==1) s="leave image as is";
else if (disposal==2) s="clear with background";
else if (disposal==3) s="restore previous image";
else                  s="reserved";

Als ik het render met mijn decoder ziet het er zo uit:

[![capture][1]][1]

Er zijn dus 2 mogelijke dingen die hier spelen:

  1. transparantie

misschien moet dit worden behandeld als een transparante afbeelding met achtergrond, maar zelfs een fatsoenlijke afbeeldingsviewer (zoals FastStone Image Viewer) laat hetzelfde zien, dus ik betwijfel of dit het geval is…

  1. extensies

Dit is de meest waarschijnlijke oorzaak. Tegenwoordig zijn WEB-browsers (nu al een paar jaar) afhankelijk van ongedocumenteerde, op maat gemaakte extensies die zijn toegevoegd aan GIF-extensiepakketten (en maken geen deel uit van enige GIF-specificaties) en negeren ze het GIF-bestandsformaat volledig voor sommige aspecten van weergave (zoals looping). Simpelweg omdat ze allemaal dezelfde afbeeldingsbibliotheek gebruiken voor het decoderen van GIF’s die gewoon slecht gecodeerd zijn (of door ontwerp)…

voor meer info zie:

Dus mijn gok is dat de GIF van jou een extensiepakket heeft dat Brownser vertelt een andere verwijderingsmethode te gebruiken dan degene die is opgeslagen in de GIF-header. Dus je GIF is gewoon buggy en alleen de GIF-decoder met fouten kan het correct weergeven …

Dus je decoder negeert de achtergrondkleur van GIF en wordt daarom onjuist weergegeven omdat de incrementele weergave niet werkt met een niet-zwarte achtergrondkleur …

En ja, die witte lijnen zijn met gaten … het is geen alias …
[1]: https://i.stack.imgur.com/6Kbbp.gif


Antwoord 2

Je hebt de methode paintin je JFrameoverschreven. Dit betekent dat het JFramezelf niet meer wordt geverfd (of om het simpeler te zeggen, de achtergrond van je afbeelding wordt nooit geverfd). Voeg een aanroep toe aan super.paint(g)in de paintmethode hierboven waar je de afbeelding schildert, zodat de achtergrond over de vorige gif-afbeelding heen wordt geschilderd telkens wanneer een nieuwe gif-afbeelding toont:

@Override
public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(TestImage, 0, 0, 300, 300, this);
}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

five × five =

Other episodes