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 <[email protected]> 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
