Hi, Yes it looks like i mixed this up with transparency!
Tom On 17.03.14 10:03, Kevin Rushforth wrote: > 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.schi...@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 >>>