Are you sure your mask is actually greyscale? If I looks as if
there's a repeating pattern in your result image. Maybe you could
also use an assert to make sure bitsPerComponent() == bitsPerPixel()
and #components==1.
On 16-Feb-2008, at 13:45 , Erik van Blokland wrote:
Folks,
I've been wrestling with some CoreGraphics stuff, OSX 10.5.2, stock
Python 2.5.1. I want to load a RGB image, then load a grayscale
image, draw one while using the other as a mask. I can build all
the required objects. I can draw with masking-like things
happening to the image. But the masking appears to be according to
a (random) piece of memory, rather than the pixels from the mask
image.
The RGB image:
http://erik.letterror.com/cg/picture.png
The grayscale mask:
http://erik.letterror.com/cg/mask.tif
The resulting image:
http://erik.letterror.com/cg/results.png
The script:
http://erik.letterror.com/cg/cgMaskTestPost.py
The script which draws this file is below. Yellow background, rgb
image of a neon sign, mask. I get the impression I'm somehow not
making the right kind of mask. Or perhaps the parameters I'm
passing to it are wrong. Perhaps the mask image is wrong. I've
tried black/white bitmaps, tiff, jpeg, png, grayscale 8 bit, 24
bit. Different formats result in different patterns being used as a
mask - so there is some correlation between the file and the
result. Is this anywhere close to how it needs to be done?
Any pointers are most welcome, thanks!
Erik van Blokland
#! /usr/bin/python2.5
from CoreGraphics import *
import os
def test():
testWidth = 1000
testHeight = 500
fileName = 'picture.png'# name of a 8 bit PNG, RGB image
maskName = 'mask.tif' # name of an 8 bit, grayscale tiff
# the paths
root = os.getcwd()
filePath = os.path.join(root,fileName)
maskPath = os.path.join(root,maskName)
dstPath = os.path.join(root, results.png)
# data providers for the image and the mask
img = CGImageImport(CGDataProviderCreateWithFilename(filePath))
maskProvider = CGDataProviderCreateWithFilename(maskPath)
imgMask = CGImageImport(maskProvider)
# first, let's find out some things about the mask.
width = imgMask.getWidth()
height = imgMask.getHeight()
bitsPerComponent = imgMask.getBitsPerComponent()
bitsPerPixel = imgMask.getBitsPerPixel()
bytesPerRow = imgMask.getBytesPerRow()
shouldInterpolate = True
decode = [0,255]# not relevant?
# make the mask
maskObject = CGImageMaskCreate(width, height,
bitsPerComponent, bitsPerPixel,
bytesPerRow, maskProvider,
decode, shouldInterpolate)
# now make the image with source image AND mask
imgWithMask = CGImage_createWithMask(img, maskObject)
# make a new image to save it all
ctx = CGBitmapContextCreateWithColor(testWidth, testHeight,
CGColorSpaceCreateDeviceRGB(), (0,0,0,0))
# a background color
ctx.setRGBFillColor(.9, .9, 0, .8)
ctx.addRect(CGRectMake(0, 0, testWidth, testHeight))
ctx.fillPath()
# draw the masked image
ctx.drawImage(CGRectMake(50, 50, width, height), imgWithMask)
CGContext_writeToFile(ctx, dstPath, kCGImageFormatPNG)
print done
if __name__ == __main__:
test()
___
Pythonmac-SIG maillist - Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig
--
Jack Jansen, [EMAIL PROTECTED], http://www.cwi.nl/~jack
If I can't dance I don't want to be part of your revolution -- Emma
Goldman
___
Pythonmac-SIG maillist - Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig