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?
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:
- 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…
- 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 paint
in je JFrame
overschreven. Dit betekent dat het JFrame
zelf 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 paint
methode 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);
}