Can I use use areaAverage() to analyze an actual image?
MauriceMeilleur last edited by MauriceMeilleur
For an upcoming course—and for my book on Jurriaan Schrofer—I'm trying to recreate the process some of Schrofer's former colleagues at Total Design used in 1987 to rasterize a photo of him with various weights of one of his script designs.
It seems like I should be able to use areaAverage() to scan a grid of areas in a given image, get the average color of each area, and then use that information to choose an appropriate weight of the glyph that will act as a pixel for that area in the generated image. That is, I'll get a 1px image with that average color—which I can presumably then extract the color information from to use further?
But: the output of my code suggests that areaAverage() isn't seeing the image in the ImageObject. I'm saving the images in an array to analyze them one at a time; here's the code:
path = '/Users/meilleur/Desktop/maurice-meilleur-web-600p_hi.png' w, h = imageSize(path) newPage(w, h) im = ImageObject() with im: size(w, h) image(path, (0, 0)) image(im, (0, 0)) res = 60 s = w/res areas =  startX = 0; startY = 0 for row in range(res): y = startY + row * s temp =  for col in range(res): x = startX + col * s temp.append(im.areaAverage((x, y, s, s))) areas.append(temp) print(imagePixelColor(areas, (0, 0)))
And this throws an error:
Traceback (most recent call last):
File "schrofer_illegible_raster.py", line 23, in <module>
File "/Applications/DrawBot.app/Contents/Resources/lib/python3.9/drawBot/drawBotDrawingTools.py", line 2020, in imagePixelColor
AttributeError: 'NoneType' object has no attribute 'startswith'
Obviously I'm missing something here …
monomonnik last edited by
areaAverage() does not return anything, but changes the imageObject.
p = 'schrofer_head.jpg' im = ImageObject(p) print(im.size()) # (1365.0, 1365.0) im.areaAverage() print(im.size()) # (1.0, 1.0) print(imagePixelColor(im, (0, 0))) # (0.6, 0.6039215686274509, 0.6, 1.0)
thanks @monomonnik that is correct
MauriceMeilleur last edited by
Thanks—I guess this makes sense, but the docs suggest that it's possible to add arguments to specify an 'area of interest' (https://www.drawbot.com/content/image/imageObject.html#drawBot.context.tools.imageObject.ImageObject.areaAverage). In any case I found a workaround by getting creative with sampling pixels in the image.
monomonnik last edited by
The thing that tripped me up initially was ‘Returns a single-pixel image…’. I was (mis)reading that and assumed that ‘returns’ meant ‘returns a new image’ instead of altering the imageObject.
I’m not sure if the documentation is a little confusing, or that the behaviour of areaAverage is unexpected.