Image filters (Cocoa CIKernel example)
Posted: Thu Oct 18, 2012 4:31 pm
Maybe others like to play with the kernel language as well and post other examples.
Information about the kernel language :
https://developer.apple.com/library/mac ... ction.html
CoreImageKernel.pbi
Information about the kernel language :
https://developer.apple.com/library/mac ... ction.html
CoreImageKernel.pbi
Code: Select all
Global NewMap CoreImageKernel.i()
Procedure AddCoreImageKernels(KernelCode.s)
Protected.i Kernels, Kernel, Enum
Protected.s KernelName
Kernels = CocoaMessage(0, 0, "CIKernel kernelsWithString:$", @KernelCode)
If Kernels
Enum = CocoaMessage(0, Kernels, "objectEnumerator")
Kernel = CocoaMessage(0, Enum, "nextObject")
While Kernel
KernelName = PeekS(CocoaMessage(0, CocoaMessage(0, Kernel, "name"), "UTF8String"), -1, #PB_UTF8)
CoreImageKernel(KernelName) = CocoaMessage(0, Kernel, "retain")
Kernel = CocoaMessage(0, Enum, "nextObject")
Wend
EndIf
EndProcedure
Procedure ApplyCoreImageKernel(Image, KernelName.s, Arguments = #nil)
Protected Kernel = CoreImageKernel(KernelName)
If Kernel And IsImage(Image)
Protected CIImage, Rep = CocoaMessage(0, CocoaMessage(0, ImageID(Image), "representations"), "objectAtIndex:", 0)
If CocoaMessage(0, Rep, "isKindOfClass:", CocoaMessage(0, 0, "NSBitmapImageRep class"))
CIImage = CocoaMessage(0, CocoaMessage(0, CocoaMessage(0, 0, "CIImage alloc"), "initWithBitmapImageRep:", Rep), "autorelease")
Else
CIImage = CocoaMessage(0, 0, "CIImage imageWithData:", CocoaMessage(0, ImageID(Image), "TIFFRepresentation"))
EndIf
Protected Filter = CocoaMessage(0, CocoaMessage(0, 0, "CIFilter new"), "autorelease")
Protected ArgArr = CocoaMessage(0, 0, "NSArray arrayWithObject:", CocoaMessage(0, 0, "CISampler samplerWithImage:", CIImage))
If Arguments : CocoaMessage(@ArgArr, ArgArr, "arrayByAddingObjectsFromArray:", Arguments) : EndIf
CocoaMessage(@CIImage, Filter, "apply:", Kernel, "arguments:", ArgArr, "options:", #nil)
Protected ImageRect.NSRect\size\width = ImageWidth(Image) : imageRect\size\height = ImageHeight(Image)
Protected Delta.CGFloat = 1
StartDrawing(ImageOutput(Image))
CocoaMessage(0, CIImage, "drawInRect:@", @ImageRect, "fromRect:@", @ImageRect, "operation:", #NSCompositeCopy, "fraction:@", @Delta)
StopDrawing()
EndIf
EndProcedure