Comment faire pour modifier la luminosité d'une Image
Ma Question: je veux être en mesure de modifier la luminosité d'une image de ressource et ont trois instances comme ImageIcons. À 50% de luminosité (donc plus sombre), l'autre à 75% de luminosité (un peu plus clair), et enfin un autre à 100% de luminosité (la même que l'image d'origine). Je tiens également à préserver la transparence.
Ce que j'ai essayé: j'ai cherché partout et il semble que la meilleure solution est d'utiliser RescaleOp
, mais je ne peux pas le comprendre. Je ne sais pas ce que le scaleFactor et le décalage est tout au sujet. Voici mon code pour ce que j'ai essayé.
public void initialize(String imageLocation, float regularBrightness, float focusedBrightness, float pressedBrightness, String borderTitle) throws IOException {
BufferedImage bufferedImage = ImageIO.read(ButtonIcon.class.getResource(imageLocation));
setRegularIcon(getAlteredImageIcon(bufferedImage, regularBrightness));
setFocusedIcon(getAlteredImageIcon(bufferedImage, focusedBrightness));
setPressedIcon(getAlteredImageIcon(bufferedImage, pressedBrightness));
setTitle(borderTitle);
init();
}
private ImageIcon getAlteredImageIcon(BufferedImage bufferedImage, float brightness) {
RescaleOp rescaleOp = new RescaleOp(brightness, 0, null);
return new ImageIcon(rescaleOp.filter(bufferedImage, null));
}
L'appel serait quelque chose comme ceci:
seeATemplateButton.initialize("/resources/templateIcon-regular.png", 100f, 75f, 50f, "See A Template");
//I think my 100f, 75f, 50f variables need to change, but whenever I change them it behaves unexpectedly (changes colors and stuff).
Ce qui se passe avec ce code: L'image apparaît "invisible", je sais qu'il est là parce que c'est sur un JLabel avec une souris cliqué événement sur elle et qui fonctionne très bien. Si je sautez simplement la luminosité de l'évolution de la partie et dire setRegularIcon(new ImageIcon(Button.class.getResource(imageLocation));
il fonctionne très bien, mais à l'évidence il n'est pas plus foncé.
Ce que je pense que j'ai besoin: Certains d'aide pour comprendre ce que offset
, scaleFactor
, et la filter
méthode de dire/faire, et, par conséquent, quels sont les numéros de donner de la luminosité variable.
Toute aide serait grandement appréciée! Merci!
OriginalL'auteur kentcdodds | 2012-10-19
Vous devez vous connecter pour publier un commentaire.
Le doc a dit:
Le pseudo-code pour la mise à l'échelle de l'opération est comme suit:
C'est juste une transformation linéaire sur chaque pixel. Les paramètres de transformation sont
scaleFactor
etoffset
. Si vous voulez 100% de luminosité, cette transformation doit être une identité, c'est à diredstElement = srcElement
. RéglagescaleFactor = 1
etoffset = 0
fait le tour.Maintenant, supposons que vous voulez rendre l'image plus sombre, à 75% de luminosité, comme vous dites. Ce qui revient à multiplier les valeurs de pixel par 0,75. Vous souhaitez:
dstElement = 0.75 * srcElement
. Le choix de scaleFactor =0.75
etoffset = 0
devrait faire l'affaire. Le problème avec vos valeurs, c'est qu'ils vont de 0 à 100, vous avez besoin d'utiliser des valeurs entre 0 et 1.filter
appel àfilter(bufferedImage, bufferedImage)
plutôt quefilter(bufferedImage, null)
c'est une drôle de couleur bleue. Une idée?Ces RVB ou niveaux de gris des images? Qui est pertinent. Vérifier ce lien
Ce sont des images RVB.
Votre code est juste comme dans l'exemple, devrait être OK. D'un autre manipulation à faire avec l'icône avant de l'afficher? Essayez de l'enregistrer sur le disque juste après l'appel de
filter
et de regarder l'image enregistrée.si bufferedImage.getType()==BufferedImage.TYPE_INT_ARGB alors que diriez-vous d'utiliser les nouvelles RescaleOp(new float[]{1.2 f 1.2 f 1.2 f,1.0 f},new float[] {0f,0f,0f,0f},null); à la place de la nouvelle RescaleOp(1.2 f, 0f, null);
OriginalL'auteur dario_ramos
Je dirais juste écrit sur l'image avec un semi-transparente noire.
En supposant que vous voulez écrire directement sur l'image:
Ou si vous êtes simplement à l'aide de l'image à des fins d'affichage, de le faire dans le
paintComponent
méthode. Voici un SSCCE:MODIFIER
En supposant que le même code que ci-dessus, vous pouvez manipuler tout, en plus de l'Alpha par de jouer avec le rasterizer. Voici un exemple (peinture
shadedImage
au lieu deimg
si vous utilisez cet exemple). Veuillez noter que ce n'est pas l'attraper cas de bord de valeurs RVB de plus de 256 et moins de 0.Touche - j'étais sous l'hypothèse que lorsque vous avez dit "je tiens également à préserver la transparence." Vous signifiait qu'il devrait toujours être transparent (mais plus sombre). Donc, si c'est censé juste être transparent, c'est différent.
Ouais, mais votre SSCCE a très bien fonctionné et m'a aidé à comprendre ce qui se passait. Souhaite qu'il fonctionne pour mon cas d'utilisation!
Ajout de mise à jour qui traite de la question de la transparence. Aurait été mieux que de réponses séparée, - peut-être que je vais retirer ma première réponse (laissez-moi savoir ce que vous en pensez).
Si le pourcentage est 0f, ce sera la rencontre d'une exception parce que la couleur serait alors créé avec une composante alpha de 256. La luminosité doit être
(int) (256 - 256 * percentage)
.OriginalL'auteur Nick Rippe
Quelques exemples pour l'étude:
AlphaTest
recadre juste la transparence alpha d'une image entre zéro et un avec pas de compensations. Par coïncidence, il a également ré-échantillonne l'image de trois-quart de la taille.RescaleOpTest
fait de même à l'aide d'une échelle fixe et pas de compensations.RescaleTest
échelles tous bandes d'une image entre zéro et deux avec pas de compensations.Comme indiqué dans le API, l'échelle et le décalage sont appliquées à chaque groupe d'inclinaison de la pente et yà l'origine, respectivement, d'une fonction linéaire.
OriginalL'auteur trashgod
La logique de base est de prendre la valeur RVB de chaque pixel ,ajouter un peu de facteur,réglez de nouveau à resulltant de la matrice(Tampon de l'Image)
OriginalL'auteur Tarun Rawat