main.py
from PyObjCTools import AppHelper
import HazeFilterView
import MyHazeFilter
import objc; objc.setVerbose(True)
AppHelper.runEventLoop()
Translation into python of and ADC example of the same name.
from Cocoa import *
from Quartz import *
import objc
import MyHazeFilter
class HazeFilterView (NSView):
filter = objc.ivar()
distance = objc.ivar(type=objc._C_FLT)
slope = objc.ivar(type=objc._C_FLT)
def distanceSliderChanged_(self, sender):
self.distance = sender.floatValue()
self.setNeedsDisplay_(True)
def slopeSliderChanged_(self, sender):
self.slope = sender.floatValue()
self.setNeedsDisplay_(True)
def drawRect_(self, rect):
cg = CGRectMake(
NSMinX(rect), NSMinY(rect), NSWidth(rect), NSHeight(rect))
context = NSGraphicsContext.currentContext().CIContext()
if self.filter is None:
# make sure initialize is called
MyHazeFilter.MyHazeFilter.pyobjc_classMethods.class__()
url = NSURL.fileURLWithPath_(
NSBundle.mainBundle().pathForResource_ofType_(
"CraterLake", "jpg"))
self.filter = CIFilter.filterWithName_("MyHazeRemover")
self.filter.setValue_forKey_(
CIImage.imageWithContentsOfURL_(url),
"inputImage")
self.filter.setValue_forKey_(
CIColor.colorWithRed_green_blue_(0.7, 0.9, 1),
"inputColor")
self.filter.setValue_forKey_(self.distance, "inputDistance")
self.filter.setValue_forKey_(self.slope, "inputSlope")
if context is not None:
context.drawImage_atPoint_fromRect_(
self.filter.valueForKey_("outputImage"),
cg.origin, cg)
from Cocoa import *
from Quartz import *
import objc
_hazeRemovalKernel = None
class MyHazeFilter (CIFilter):
inputImage = objc.ivar()
inputColor = objc.ivar()
inputDistance = objc.ivar()
inputSlope = objc.ivar()
@classmethod
def initialize(cls):
CIFilter.registerFilterName_constructor_classAttributes_(
"MyHazeRemover", cls, {
kCIAttributeFilterDisplayName: "Haze Remover" ,
kCIAttributeFilterCategories: [
kCICategoryColorAdjustment, kCICategoryVideo,
kCICategoryStillImage, kCICategoryInterlaced,
kCICategoryNonSquarePixels,
],
"inputDistance": {
kCIAttributeMin: 0.0,
kCIAttributeMax: 1.0,
kCIAttributeSliderMin: 0.0,
kCIAttributeSliderMax: 0.7,
kCIAttributeDefault: 0.2,
kCIAttributeIdentity: 0.0,
kCIAttributeType: kCIAttributeTypeScalar,
},
"inputSlope": {
kCIAttributeSliderMin: -0.01,
kCIAttributeSliderMax: 0.01,
kCIAttributeDefault: 0.0,
kCIAttributeIdentity: 0.0,
kCIAttributeType: kCIAttributeTypeScalar,
},
"inputColor": {
kCIAttributeDefault: CIColor.colorWithRed_green_blue_alpha_(
1.0, 1.0, 1.0, 1.0),
},
})
@classmethod
def filterWithName_(cls, name):
filter = cls.alloc().init()
return filter
def init(self):
global _hazeRemovalKernel
if _hazeRemovalKernel is None:
bundle = NSBundle.bundleForClass_(type(self))
code = open(bundle.pathForResource_ofType_(
"MyHazeRemoval", "cikernel"), 'rb').read()
kernels = CIKernel.kernelsWithString_(code)
_hazeRemovalKernel = kernels[0]
return super(MyHazeFilter, self).init()
def outputImage(self):
src = CISampler.samplerWithImage_(self.inputImage)
return self.apply_arguments_options_(_hazeRemovalKernel,
(src, self.inputColor, self.inputDistance, self.inputSlope),
{ "definition": src.definition() })
from PyObjCTools import AppHelper
import HazeFilterView
import MyHazeFilter
import objc; objc.setVerbose(True)
AppHelper.runEventLoop()
"""
Script for building the example.
Usage:
python setup.py py2app
"""
from distutils.core import setup
import py2app
setup(
name='CIHazeFilterSample',
app=["main.py"],
data_files=["English.lproj", 'MyHazeRemoval.cikernel', 'CraterLake.jpg'],
)