+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

Reply via email to