AGG第四十二课Blittinganimageoveranotherwithtransparency
问题:
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的萨嘎网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
I've managed to blit a loaded p_w_picpath onto another through the method
"copy_from(...)" of renderer_base.
I'd like to know how can i blit the same p_w_picpath and also specifying a color
that will NOT overwrite the pixels of the destination p_w_picpath ( a color that
will then result transparent ).
I complete my question by specifying that the source p_w_picpath is a BMP and
therefore doesn't support transparency and alpha channel in the pixel
values.
Any suggestion is appreciated
回答:
Yes, your simple question isn't actually that simple. I could add this
functionality to copy_from, but I don't know what exactly to add. Do you
need to make transparent only one color? Or a number of colors? Or maybe it
should be some volume in RGB with transparency determined by the distance
from a certain point. OK, suppose you need only one color, bu someone else
may want to make a number of colors translucent. And so on. We need a kind
of a general solution.
For now you can try to use a method similar to the one in
examples/p_w_picpath_alpha.cpp
See class span_conv_brightness_alpha_rgb8 and modify it as you want.
But it's a transformer, so that, works slower than copy_from. Besides, with
any kind of a filter (bilinear and such) the colors are not exact, so, it's
probably makes sense to use span_p_w_picpath_filter_rgb_nn instead of
span_p_w_picpath_filter_rgb_bilinear.
Maybe it makes sense to add some functor to copy_from(), but I have no idea
how to do that in a general way and without losing performance. Perhaps
there should be another function more like blend_from(). Any ideas?
答复:
Actually I've gone for a "specialized" solution, that just solves my case.
In detail, I created a new renderer that's only suitable to copy bitmaps one
over another with 1 transparent color.
I only have ported the "copy_from" method from renderer_base along with all
the clipping helper methods and obejcts of your original rendere_base.
I added a method that sets a trasparency color:
setTransaprentColor(color_type color)
{
...
}
In the "copy_from" method, I get the color of the source bitmap with the
"pixel(x,y)" method, check it against "transparentColor" and, if equal, I
simply skip the point with a "continue" statement.
Else, I call "copy_pixel" on the underlying rendering_buffer with the exact
value of the source bitmap pixel.
It's evident that it can be easily extended to a generic "array" of
transparent colors, with the cost of cycling through all of them to see if
one of them matches the source color. Even better, one could even imagine to
"map" some source color with some other colors (along with its own alpha
channel) once the source RGB values are matched against the RGB values of
the "transformer" object. I thought about it and it is not difficult to code
such a transformer object and pass it to a renderer. But that would be too
much for my special case and also kind of "expensive" in terms of
performance, so I just left it "for future expansions" ;-)
本文名称:AGG第四十二课Blittinganimageoveranotherwithtransparency
网站链接:http://ybzwz.com/article/igjioo.html