Some SVG Questions
I have posted some of my experiments, but have yet to mark any
"SOLVED."
Please e-mail me at david.dailey@sru.edu
with solutions. I will post solutions here, unless you specify otherwise.
1. Is there a way, using filters, to take an image A and produce it
photographic negative A', such that 255-C(A)=C(A') for each channel C in {R,G,B)?
I've fooled a bit with the filter "feComponentTransfer"
with some hints of success, but it seems like so natural a thing that there must
be a straightforward way that I'm just missing. Here is an approach that comes
close using <feComponentTransfer> together with <feComposite
operator="arithmetic">.
ComponentTransferComposite.svg. It
produces an image which looks like a spectrum-equalized version of the negative.
2. On a related theme, <feBlend/> has modes including "screen", "multiply" etc.
Is there a way to create the "difference" between two images (as with the
Photoshop difference filter) in SVG? Here's the best I have figured out so far:
ImageDiffer.svg.
3. If I deform a simple shape using < feDisplacementMap/> (see for example
eggcloning3.svg where the user may unleash fried
eggs bouncing and sliding over a radial washboard) is there any way to determine
exactly how far an image has been moved by that transformation? id est what is
the on-screen locus of a shape deformed by a transformation? If so, then I'd be
able to determine RGB values of pixels in the underlying image and that could
prove quite handy for other things. Are there other ways to interrogate RGB
values of pixels ? (See some allied issues under question #6.)
4. In the animation, eggcloning3.svg , (discussed
in #3, above), I observe that on slower machines its SMIL animation takes
precedence over its JavaScript animation. That is, if the browser can't keep up
with the SMIL (because there is too much processing going on) it never begins
the JavaScript animation. Is there anyway to adjust the relative priorities of
these two kinds of events?
5. To make a jig-saw puzzle using SVG, one may
a) chop up an image into little movable chunks using numerous clipPaths applied to numerous copies of an image (see for example, http://srufaculty.sru.edu/david.dailey/svg/clips2.svg). The problem is that this appears to use lots and lots of RAM and bogs down when the number of rows and columns gets large.
b) use feOffset's and feTile's to slice an image (be prepared to wait for it to render). I didn't see any easier way to grab the parts I wanted to move than this. It is way too time-consuming to be practical on a large scale.
c) build a checkerboard of red-scale values underneath the image and then distort the image using <feDisplacementMap> and the red-channel. See attempt1 or attempt2 by way of illustration. The approach looks like it will be fast and generalize easily to large images with lots of slices. The hassle is that the exact distance by which pixels are moved, while clearly related to the displacement's scale attribute and the red-scale value of the underlying map, seem not to be entirely predictable (see attempt3). The W3C spec actually spells out how the pixel loci will move, so maybe I'm just misreading it.
Is there an easier way? Can I somehow just grab the pixels out of a rectangular section of a bitmap in SVG and move (just) them around? I think I may just be missing something key in the SVG tool set.
6. Has anybody built a "distort" widget which would allow one corner of a rectangular bitmap to be grabbed and moved about, hence distorting (not just skewing) the associated image? It looks like transform="matrix(a,b,c,d,e,f)" always converts rectangles into parallelograms -- can we distort a rectangle into an arbitrary quadrilateral?
7. Do we really need the <animateColor> tag in SVG? We may animate colors using the <animate> tage with, for example, an <animate attributeName="fill" values="red;cyan;yellow;black;green"...> just fine. What else does <animateColor> do for us?
Back to Dailey's SVG page