Pour développer la réponse de Iny:
Ce que vous devez faire est ne pas enregistrer au format GIF, basiquement. GIF est une image à palette de 256 couleurs (d'où sa petite taille de fichier). Si votre image a plus de 256 couleurs, vous devez sous-échantillonner les couleurs à 256 avant d'essayer d'enregistrer. l'encodeur ne le fait pas pour vous, car il ne sait pas quoi faire. il commence probablement à écrire l'image, et une fois qu'il dépasse 256 couleurs, il se retire.
Je pense que vous pouvez le faire kindof comme celui-ci (psuedocode)
// Create the buffered image.
BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
... //fill image data (works fine)
ImageIO.write(bufferedImage, "JPG", f1); // works fine
ImageIO.write(bufferedImage, "PNG", f2); //works fine
// downsample to lower color depth by using BYTE_RGB?
BufferedImage crappyImage = new BufferedImage(w,h,BufferedImage.TYPE_BYTE_RGB);
crappyImage.getGraphics().drawImage(bufferedImage, 0, 0, w, h, null);
// or you could repeat the drawing code above with less colors
if (!ImageIO.write(crappyImage , "GIF", f3))
{
//still too many colors
f3.delete();
showError("Could not save as gif, image had too many colors");
}
Si votre code de dessin utilise anticrénelage pour regarder agréable, qui va augmenter la profondeur de couleur sans vous penser. Par exemple, dessiner une ligne bleue diagonale AA'd sur un fond blanc semblerait être 2 couleurs, Color.WHITE et Color.BLUE, mais si vous regardez de près, vous avez tout un tas de nuances de bleu pour se débarrasser de la apparence jaggy de la ligne diagonale.
Se pourrait-il que votre image utilise plus de 8 bits de couleur, et ne peut donc pas tenir dans un GIF? –