Ah, thanks so much Michael!  That explanation helps a great deal; I
was always considering things in "straight alpha" format, not even
knowing that there was alternative.

I'll play with this tonight; I don't see any problem getting the thing
working, though, now that I know what agg expects to see...

And yes, alpha support in the image class would be very helpful ;)

On Wed, Oct 19, 2011 at 2:16 PM, Michael Droettboom <md...@stsci.edu> wrote:
> You are right that Agg is doing the resizing here.  Agg expects
> premultiplied alpha.  See [1] for information about what that means.
>
> [1] http://en.wikipedia.org/wiki/Alpha_compositing
>
> After Agg interpolates the pixel values, to prevent oversaturation it
> truncates all values to be less than alpha (which makes sense if everything
> is assumed to be premultiplied alpha).  Arguably, the bug here is that
> nearest neighbor (which doesn't have to do any blending) doesn't perform the
> truncation step -- then both would look "wrong".
>
> It happens in this code snippet in span_image_filter_rgba: (base_mask is
> 255)
>
>                 if(fg[order_type::A] > base_mask)         fg[order_type::A]
> = base_mask;
>                 if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R]
> = fg[order_type::A];
>                 if(fg[order_type::G] > fg[order_type::A]) fg[order_type::G]
> = fg[order_type::A];
>                 if(fg[order_type::B] > fg[order_type::A]) fg[order_type::B]
> = fg[order_type::A];
>
> So, the solution to make a partially transparent image is to not do:
>
>     pix[:,:,3] = 127
>
> but instead, do
>
>     pix *= 0.5
>
> Of course, the real fix here is to support alpha blending properly in the
> image class, then the user wouldn't have to deal with such details.  A bug
> should probably be filed in the matplotlib issue tracker for this.
>
> Mike
>
> On 10/19/2011 12:23 PM, Daniel Hyams wrote:
>
> [Sorry, I keep getting tripped up with HTML mail....resent in ascii,
> and resaved one of the attachment png's to make it smaller.]
>
>
> Example script attached (PIL required).  Basically, if I impose a
> specific value into an image's alpha channel and use any interpolation
> scheme other than 'nearest', there appears gray all where the figure
> didn't have any color to begin with.   I've also attached a screenshot
> of the output of the script on my machine.
>
> Hopefully I'm doing something wrongly?
>
> I chased the problem and managed to hack in a solution that fixes the
> problem, but it's extremely inefficient...basically, in matplotlib's
> image.py, routine BboxImage.make_image, you can create two images
> there....one with no alpha channel (call it imRGB) and one with (call
> it imRGBA).  Go through all of the routine, doing exactly the same
> things to both of the images *except* for the interpolation, which is
> set to 'nearest' for imRGBA.  Then, rip the colors out of imRGB, the
> alpha channel off of imRGBA, and put them together....go through all
> of the routine again with this composited image, and it works.  I
> know...I told you it was bad ;)
>
> The problem seems to be in the "resize" call in that routine...resize,
> which calls into C code, does not appear to handle things correctly
> when the alpha is anything other than 255's across the board.  It
> might be a problem in the agg routines, but hopefully it is just maybe
> a misuse of the agg routines.
>
> The behavior seems to be backend independent as far as I could test (I
> tried with wxagg and tk backends).  I am using mpl 1.0.0 on Windows if
> it matters.
>
>
> --
> Daniel Hyams
> dhy...@gmail.com
>
> ------------------------------------------------------------------------------
> All the data continuously generated in your IT infrastructure contains a
> definitive record of customers, application performance, security
> threats, fraudulent activity and more. Splunk takes this data and makes
> sense of it. Business sense. IT sense. Common sense.
> http://p.sf.net/sfu/splunk-d2d-oct
>
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
>
> ------------------------------------------------------------------------------
> The demand for IT networking professionals continues to grow, and the
> demand for specialized networking skills is growing even more rapidly.
> Take a complimentary Learning@Ciosco Self-Assessment and learn
> about Cisco certifications, training, and career opportunities.
> http://p.sf.net/sfu/cisco-dev2dev
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
>



-- 
Daniel Hyams
dhy...@gmail.com

------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Ciosco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to