+1 Am 17.03.2014 um 17:51 schrieb Jasper Potts <jasper.po...@oracle.com>:
> 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