So ändern Sie die Helligkeit eines Bildes
Meine Frage: ich möchte in der Lage sein, um die Helligkeit zu ändern einer Ressource Bild und habe drei Instanzen des es als ImageIcons. Eine bei 50% Helligkeit (also dunkler), andere bei 75% Helligkeit (ein wenig heller), und schließlich ein weiteres bei 100% Helligkeit (die gleiche wie das original-Bild). Ich möchte auch die Transparenz erhalten.
, Was ich versucht habe: ich gesucht habe um und es sieht aus wie die beste Lösung ist die Verwendung RescaleOp
, aber ich kann es einfach nicht herausfinden. Ich weiß nicht, was die scaleFactor, und der offset ist. Hier ist mein code für das, was ich versucht habe.
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));
}
Der Aufruf wäre etwas wie dieses:
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).
Was passiert mit diesem code: erscheint Das Bild "unsichtbar" ich weiß, es ist da, weil es auf ein JLabel mit einer Maus geklickt Fall drauf und das funktioniert Prima. Wenn ich die einfach überspringen Sie die Helligkeit ändern Teil und sagen setRegularIcon(new ImageIcon(Button.class.getResource(imageLocation));
funktioniert es ganz gut, aber offensichtlich ist es nicht dunkler.
, Was ich denke, ich brauche: Einigen helfen zu verstehen, was offset
, scaleFactor
, und die filter
Methode bedeuten/machen, und folglich, welche zahlen für die variable Helligkeit.
Jede Hilfe wäre sehr geschätzt werden! Danke!
- siehe eine ähnliche Frage : stackoverflow.com/questions/3433275/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der doc sagt:
Den pseudo-code für die Skalierung Vorgang wie folgt:
Es ist nur eine lineare transformation an jedem pixel. Die Parameter für diese Umwandlung sind
scaleFactor
undoffset
. Wenn Sie möchten, 100% Helligkeit, diese Transformation muss eine Identität, d.h.dstElement = srcElement
. EinstellungscaleFactor = 1
undoffset = 0
funktioniert der trick.Nun mal angenommen, Sie wollen, um das Bild dunkler, bei 75% Helligkeit, wie Sie sagen. Das entspricht der Multiplikation die pixel-Werte von 0.75. Sie wollen:
dstElement = 0.75 * srcElement
. Also Einstellung scaleFactor =0.75
undoffset = 0
sollte den trick tun. Das problem mit den Werten ist, dass Sie gehen von 0 bis 100 verwenden, benötigen Sie Werte zwischen 0 und 1.filter
Ausschreibungfilter(bufferedImage, bufferedImage)
eher alsfilter(bufferedImage, null)
es ist eine komische Blaue Farbe. Irgendeine Idee?filter
und Blick auf das gespeicherte Bild.Ich würde vorschlagen nur das schreiben über das Bild mit einem semi-transparenten schwarz.
Angenommen, Sie möchten, schreiben Sie direkt auf das Bild:
Oder wenn Sie nur mit dem Bild für die Anzeige, tun Sie es in der
paintComponent
Methode. Hier ist ein SSCCE:BEARBEITEN
Vorausgesetzt, die denselben code wie oben, können Sie manipulieren alles, was neben der Alpha von messing mit dem rasterizer. Hier ist ein Beispiel (Farbe
shadedImage
stattimg
wenn dieses Beispiel). Bitte beachten Sie, diese nicht zu fangen Grenzfälle der RGB-Werte, die größer als 256 ist und weniger als 0.(int) (256 - 256 * percentage)
.Ein paar weitere Beispiele für die Studie:
AlphaTest
vergrößert oder verkleinert sich nur die alpha-Transparenz eines Bildes zwischen null und eins ohne offsets. Zufällig, es passt in diesem Fall auch das Bild von drei Viertel der Größe.RescaleOpTest
macht das gleiche mit einem festen Maßstab und keine offsets.RescaleTest
Skalen alle bands eines Bildes zwischen null und zwei mit keine offsets.Wie bereits in der API, die Skalierung und offset angewandt auf jedes band wie die Steigung und y-abfangen, bzw. eine lineare Funktion.
Grundlegende Logik ist, nehmen Sie RGB-Wert jedes pixels ,fügen Sie einen Faktor an,setzen Sie es wieder zu resulltant matrix(Buffered Image)