CIHazeFilterSample

Translation into python of and ADC example of the same name.

Sources

HazeFilterView.py

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)

MyHazeFilter.py

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() })

main.py

from PyObjCTools import  AppHelper

import HazeFilterView
import MyHazeFilter

import objc; objc.setVerbose(True)

AppHelper.runEventLoop()

setup.py

"""
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'],
)

Resources

Table Of Contents

Resources

Support development