Opacity in Image.getPixelReader.getColor()
Kevin Rushforth
kevin.rushforth at oracle.com
Mon Mar 17 17:03:30 UTC 2014
I'm sure Jim could word this better, but here goes...
Opacity and alpha are mostly used interchangeably. Whether the range is
expressed as a normalized value [0.0,1.0] or an 8-bit pixel value
[0,255], the meaning is the same. A value of 0 means that the color is
completely transparent. When using the default SRC_OVER blend equation,
a pixel with this color will have no effect. A value of 1.0 (if using a
normalized value) or 255 (if using an 8-bit integer value) means that
the color is fully opaque. When using the default SRC_OVER blend
equation, a pixel with this color will overwrite whatever is underneath it.
Perhaps Tom is thinking of "transparency" which, if we were to have such
an attribute, would be defined as (1.0-opacity).
-- Kevin
Jasper Potts wrote:
> My understanding is alpha and opacity are same just different range.
>
> Opacity is 0.0 to 1.0
> Alpha is 0 to 255
>
> Jim or Kevin will be authority on this.
>
> Jasper
>
>
>> On Mar 16, 2014, at 5:55 AM, Tom Schindl <tom.schindl at bestsolution.at> wrote:
>>
>> Hi,
>>
>> Maybe I'm completely wrong but to me it looks like the opacity I get
>> from Image.getPixelReader.getColor() is wrong.
>>
>> If not mistaken the relation between alpha and opacity is expressed with:
>>
>> opacity = (255 - alpha) / 255.0
>>
>> which means:
>>
>> opacity 0 => alpha 255
>> opacity 1 => alpha 0
>>
>> Running the following programm on a gif
>>
>>
>>> public class OpacityBug extends Application {
>>>
>>> @Override
>>> public void start(Stage primaryStage) throws Exception {
>>> Image image = new Image(getClass().getResourceAsStream("methpri_obj.gif"));
>>> int width = (int) image.getWidth();
>>> int height = (int) image.getHeight();
>>>
>>> PixelReader reader = image.getPixelReader();
>>> for (int x = width - 1; x >= 0; x--) {
>>> for (int y = height - 1; y >= 0; y--) {
>>> int argb = reader.getArgb(x, y);
>>> int alphaArgb = (argb >> 24) & 0xFF;
>>> Color color = reader.getColor(x, y);
>>> double opacity = color.getOpacity();
>>> System.err.println(x+","+y + " => alpha: " + alphaArgb + " op: " + opacity + " op-alpha: " + opacityToAlpha(opacity) + " color: " + color);
>>> }
>>> }
>>> }
>>>
>>>
>>> private static int opacityToAlpha(double opacity) {
>>> return (int)Math.round((((opacity * 255.0) - 255) * -1));
>>> }
>>>
>>> public static void main(String[] args) {
>>> Application.launch(args);
>>> }
>>> }
>>>
>> produces and output like:
>> 15,15 => alpha: 0 op: 0.0 op-alpha: 255 color: 0x00000000
>>
>> which to my understanding is wrong. The argb value is correct (if
>> compared to the image because the pixel at 15,15 is fully transparent)
>> but then the the opacity should be 1.0 but is the opposite.
>>
>> Looking at the code in Image I see:
>>
>>> @Override
>>> public Color getColor(int x, int y) {
>>> int argb = getArgb(x, y);
>>> int a = argb >>> 24;
>>> int r = (argb >> 16) & 0xff;
>>> int g = (argb >> 8) & 0xff;
>>> int b = (argb ) & 0xff;
>>> return Color.rgb(r, g, b, a / 255.0);
>>> }
>>>
>> which means that:
>> a) my formula from the above is wrong
>> b) or there's the bug because it should be
>> return Color.rgb(r, g, b, (255 - a) / 255.0);
>>
>> May I also suggest to add get a
>> - Color.argb(int r,int g,int b,int alpha)
>> maybe it is just me but I'm so much more used to alpha than opacity that
>> I always have to look it up when i need it.
>>
>> Tom
>>
More information about the openjfx-dev
mailing list