Re: [Pythonmac-SIG] CoreGraphics, 10.5

2008-02-18 Thread Jack Jansen
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


Re: [Pythonmac-SIG] CoreGraphics, 10.5

2008-02-18 Thread Erik van Blokland



On 18 feb 2008, at 09:30, Jack Jansen wrote:

 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.

The mask.tif file checks for 8 bit grayscale in photoshop.

When I load the image first, this works:
bitsPerPixel = imgMask.getBitsPerPixel()
bytesPerRow = imgMask.getBytesPerRow()  
assert bitsPerComponent == bitsPerPixel

 cs = imgMask.getColorSpace()
print img getNumberOfComponents, cs.getNumberOfComponents()
  img getNumberOfComponents 1

When I build the mask object, this works as well:
maskObject = CGImageMaskCreate(width, height,
bitsPerComponent, bitsPerPixel,
bytesPerRow, maskProvider,
decode, shouldInterpolate)

bitsPerComponent = maskObject.getBitsPerComponent()
bitsPerPixel = maskObject.getBitsPerPixel()
assert bitsPerComponent == bitsPerPixel

The mask object returns None for getColorSpace(). So, the image checks  
for 1 component and 8 bits, but I don't know whether the mask itself  
should.

I've posted the updated test script here:
http://erik.letterror.com/cg/cgMaskTestPost.py

Thanks for looking though! :)

Erik


 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



___
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig