[Résolu] Redimensionnement d'image
-
Salut !
Bon je sais pas trop où poster ça donc si l’administration a l’amabilité de déplacer le sujet dans un lieu plus propice, ça me va.
Bref, j’ai une BufferedImage que je me tue à redimensionner depuis 2 jours sans arriver au format voulu. Je m’explique : je suis en train de programmer un Launcher complet (Identification à Minecraft.net, mise à jour des mods, anticheat etc…). Je suis arrivé à la phase identification à Minecraft.net, le serviable serveur (ouais je sais c’est pourri ) me donne le pseudo et le token d’identification, je lui demande de me donner le skin du joueur afin de l’afficher dans le launcher, de recouper le skin afin de ne conserver que la tête et BIM, je tombe avec ça :
(Oui c’est un peu petit ^^)
Evidemment quand je la redimensionne, c’est ignoble :
(Truc bien dégueu)
Donc on peut en déduire que ça ne marche pas…Je souhaiterais simplement arriver au résultat que vous pouvez observer via… mon profil à gauche de ce message.
Je remercie d’avance tout vaillant chevalier venant résoudre cet épineux problème.
-
Impossible de voir tes images.
-
@‘Superloup10’:
Impossible de voir tes images.
Oui maintenant oui. J’ai tout changé ^^
-
L’image est en 16x16, et si j’en crois ce que je vois, tu veux la mettre en 128x128 ou 256x256, c’est faisable mais pas via un imagebuffer car ça “zoom” et ça donne ce résultat moche.
Cela dit, tu peux l’agrandir sur photoshop :
Donc sur photoshop :
- ALT+CTRL+I, tu arriveras sur cette fenêtre : http://puu.sh/7jK2N.png (Seul la partie ou j’ai sélectionné “Pixels” nous intéresse)
Vérifie que c’est bien mis sur “pixel” et non “cm”.
Et SURTOUT : http://puu.sh/7jK8y.png Change “bicubique” par “au plus proche”
Voili voilou. Je t’ai montré comment procéder sur Photoshop, si tu utilises un autre logiciel, ce n’est pas à moi qu’il faut s’adresser.
-
Sinon, avec le code:
BufferedImage img = tonImage; Image newImage = img.getScaledInstance(newWidth, newHeight, BufferedImage.SCALE_FAST);
-
@‘elias54’:
L’image est en 16x16, et si j’en crois ce que je vois, tu veux la mettre en 128x128 ou 256x256, c’est faisable mais pas via un imagebuffer car ça “zoom” et ça donne ce résultat moche.
Cela dit, tu peux l’agrandir sur photoshop :
Donc sur photoshop :
- ALT+CTRL+I, tu arriveras sur cette fenêtre : http://puu.sh/7jK2N.png (Seul la partie ou j’ai sélectionné “Pixels” nous intéresse)
Vérifie que c’est bien mis sur “pixel” et non “cm”.
Et SURTOUT : http://puu.sh/7jK8y.png Change “bicubique” par “au plus proche”
Voili voilou. Je t’ai montré comment procéder sur Photoshop, si tu utilises un autre logiciel, ce n’est pas à moi qu’il faut s’adresser.
Merci pour l’astuce mais il faut que la tâche soit automatisée et je peux pas le faire pour tous les membres du serveur avec photoshop x)
@‘jglrxavpok’:
Sinon, avec le code:
BufferedImage img = tonImage; Image newImage = img.getScaledInstance(newWidth, newHeight, BufferedImage.SCALE_FAST);
Justement c’est déconseillé par la plupart des tutoriels, d’ailleurs ça n’a pas marché pour moi ^^, ça bloque sur cette étape (faut pas chercher à comprendre ^^).
EDIT : ENFIN ! J’ai trouvé ! J’ai trouvé une méthode sur StackOverflow qui permet de faire ce que je veux mais j’ai dû la modifier car les corrections qui sont appliquées ne font qu’accentuer le problème sur les images de cette taille. Voilà la méthode modifiée pour ceux qui la cherchent :
private Image resize(Image originalImage, int biggerWidth, int biggerHeight){ int type = BufferedImage.TYPE_INT_ARGB; BufferedImage resizedImage = new BufferedImage(biggerWidth, biggerHeight, type); Graphics2D g = resizedImage.createGraphics(); g.setComposite(AlphaComposite.Src); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawImage(originalImage, 0, 0, biggerWidth, biggerHeight, null); g.dispose(); return resizedImage; }
biggerWidth et biggerHeight sont les nouvelles dimensions de l’image en pixels. Attention : Les filtres qui suppriment le flou ont été supprimés, par conséquent, les grandes images (genre photos) peuvent être floues.
-
Pour le coup, tu peux te permettre de return une BufferedImage
-
Cherche l’attribut qui correspond à la fonction de redimensionnement qui ne fait pas de l’anti-aliasing dans la class BufferedImage.
Je ne sais pas si ça existe, mais c’est pour ça que ton image est flou.
Après rassures-moi, pour ton launcher, tu places enfin tes composants avec les layouts adaptés ??! -
Heu oui pas faux ^^.
@‘Blackout’:
Cherche l’attribut qui correspond à la fonction de redimensionnement qui ne fait pas de l’anti-aliasing dans la class BufferedImage.
Je ne sais pas si ça existe, mais c’est pour ça que ton image est flou.
Après rassures-moi, pour ton launcher, tu places enfin tes composants avec les layouts adaptés ??!xD Oui t’inquiète pas Mais c’est quand même un peu la galère
J’ai enfin réussi à comprendre comment fonctionne l’identification sur Minecraft.net, d’ailleurs leur système d’exception est, je trouve, vraiment pourri, car on peut pas faire la différence entre une erreur réseau (connexion internet), une erreur venant des serveurs Mojang ou encore une erreur de mot de passe/e-mail. Du coup j’ai dû recoder certaines parties pour la prise en charge. Il ne me manque plus que l’exécution de Minecraft, et l’anti-cheat, le système de mise à jour étant terminé.Justement je me demandais si je pouvais faire un tuto là-dessus, car il n’y a vraiment aucun tuto sur les launchers (sauf des trucs pourris où on nous demande juste de remplacer 4 bêtises dans le code pour avoir son propre launcher).
-
Le problème c’est qu’il existe tellement de moyen de faire un launcher que faire un tutoriel n’a pas vraiment d’intérêt je trouve. Quoiqu’il arrive le type qui va suivre un tutoriel va recréer un launcher type qui sera celui du tutoriel.
Une fois que tu connais ta librairie graphique (Swing, SWT, javaFx etc …), le fonctionnement de l’authentification, et un système de mise a jour, tu peux tout faire.En fait, le mieux serait un tutoriel pour chacune de ses fonctions, mais c’est déjà très bien fait par des professionnels.
Sauf l’authentification à la limite. Mais il faut savoir qu’en te loggant autre part que sur le launcher officiel, tu brises une grande barrière de sécurité et que tu n’es pas a l’abri du phishing (filoutage en français :P). Et le pire avec ça, c’est que n’importe quel néophyte peut le faire
Rien que pour les mises a jour, il y a un très bon tutoriel ici : http://neckara.developpez.com/tutoriels/conception/gestionnaire-de-mise-a-jour/?page=page_1#LI
La mise en place du système optimal est très intéressant a faire mais est surtout très long
Tu verras qu’au niveau précision et maîtrise du sujet c’est difficile de battre l’auteur du tutorielSi tu as des soucis avec Swing, n’hésite pas à me MP (Ou même a poster sur le forum)
-
Actuellement je dispose d’une combinaison de plusieurs systèmes décrits dans le tutoriel :
- Le launcher se connecte au serveur et télécharge toutes les données sur les fichiers à télécharger pour la mise à jour (très rapide car je ne télécharge pas le fichier, je le lis en live).
- Le launcher compare sa version et celle en ligne. Si une mise à jour est disponible, on passe à l’étape 3, sinon on vérifie si tous les fichiers sont présents, si oui, on arrête tout; si non, on passe à l’étape 3.
- Le launcher télécharge tous les fichiers présents sur la liste que je viens de citer et les place dans un dossier “updates”.
- Le launcher déplace ensuite tous les fichiers pour les mettre à jour.
- Le launcher exécute un petit programme puis se ferme. Le petit programme remplace l’exécutable lui-même et va ensuite exécuter le launcher. Fin de la mise à jour.
Du point de vue de l’utilisateur, tous les téléchargements se font en arrière plan (il peut donc faire ce qu’il veut pendant la mise à jour, le launcher ne se “fige” pas) et ensuite le launcher reboot.