PyCoreImage
安装
首先,需要下载安装包,下载地址:
- https://developer.apple.com/documentation/coreimage/prototyping_your_app_s_core_image_pipeline_with_python
- https://docs-assets.developer.apple.com/published/a86ed53526/PrototypingYourAppsCoreImagePipelineWithPython.zip
安装步骤:
easy_install pip
pip install setuptools --upgrade
python setup.py --user
pip install scikit-image --user
在 pyci_demo.py
文件头中也有注释,包含了安装说明
# Install
1. pip install pyobjc --ignore-installed --user
2. pip install numpy --ignore-installed --user
3. pip install scikit-image --user
确保安装 ok:
$ python
>> from pycoreimage.pyci import cimg
如果输出没有错误,那么代表安装 ok。
如果运行上面的导入库,出现其他提示信息,代表安装有问题。需要卸载后重新安装。
卸载方法 :1)列出已经安装的库列表,存入文件
$ pip freeze > list.txt
2)编辑list.txt ,筛选出带 pyobjc 和 pycoreimage 的库,然后保存。
3)从文件中批量删除已经安装的库
$ pip uninstall -r list.txt
高斯模糊滤镜的例子
源文件 gaussianBlur.py
# coding: utf-8
from pycoreimage.pyci import *
def zxdemo_minimal(filepath):
#读取文件
img = cimg.fromFile(filepath)
#图片缩放
img = img.resize(500, preserveAspect=1)
#高斯模糊
r = 20
blur = img.gaussianBlur(radius=r)
#图片保存
blur.save(filepath + '.CIGaussianBlur.jpg')
#显示图片
show([img, blur], title=['input', 'Gaussian blur with radius {}'.format(r)])
zxdemo_minimal('/Users/zx/Downloads/2018bugs/201807/0705/cheers_1440x960.heic')
可以使用 jupyter-notebook 边写边运行。
使用详细步骤说明
一般包含几个步骤:
-
导入库文件
from pycoreimage.pyci import *
pycoreimage
supports all file formats that Core Image supports, including JPEG, PNG, and HEIC.支持 JGPE,PNG,HEIC 文件
创建 cimg 对象
fpath = 'resources/YourFacialImage.HEIC'
image = cimg.fromFile(fpath)
- 对图片添加滤镜
gaussianBlurImg = image.gaussianBlur(radius=30)
- 显示图片
show([image, gaussianBlurImg], title=['input', 'Gaussian blur with radius {}'.format(r)])
常见操作
生成二维码
cimg.fromGenerator('CIQRCodeGenerator', message='Hello World!')
平移
Shift the image by the amount
(tx, ty)
with thetranslate
command:
img.translate(tx, ty)
缩放
Use the
scale
command to resize an image:
img.scale(sx, sy)
旋转
Rotate the image about its center point with the
rotate
command:
img.rotate(radians)
裁剪
Crop the image to the rectangle
[x, y, width, height]
with thecrop
command:
img.rotate(radians)
保存
img.save('demo2.jpg')
显示
show(img, title='Demo 2: from file + slicing')
滤镜操作
打印所有的滤镜列表
所有的系统滤镜,从文档可以查到
滤镜按照功能,被分进不同的类别
- CICategoryBlur
- CICategoryColorAdjustment
- CICategoryColorEffect
- CICategoryCompositeOperation
- CICategoryDistortionEffect
- CICategoryGenerator
- CICategoryGeometryAdjustment
- CICategoryGradient
- CICategoryHalftoneEffect
- CICategoryReduction
- CICategorySharpen
- CICategoryStylize
- CICategoryTileEffect
- CICategoryTransition
源文件 listFilters.py
# coding: utf-8
from pycoreimage.pyci import *
print(cimg.filters())
$ python src/listFilters.py
(
CIAccordionFoldTransition,
CIAdditionCompositing,
CIAffineClamp,
CIAffineTile,
CIAffineTransform,
CIAreaAverage,
CIAreaHistogram,
CIAreaMaximum,
CIAreaMaximumAlpha,
CIAreaMinimum,
CIAreaMinimumAlpha,
CIAreaMinMaxRed,
CIAttributedTextImageGenerator,
CIAztecCodeGenerator,
CIBarcodeGenerator,
CIBarsSwipeTransition,
CIBicubicScaleTransform,
CIBlendWithAlphaMask,
CIBlendWithBlueMask,
CIBlendWithMask,
CIBlendWithRedMask,
CIBloom,
CIBokehBlur,
CIBoxBlur,
CIBumpDistortion,
CIBumpDistortionLinear,
CICheckerboardGenerator,
CICircleSplashDistortion,
CICircularScreen,
CICircularWrap,
CIClamp,
CICMYKHalftone,
CICode128BarcodeGenerator,
CIColorBlendMode,
CIColorBurnBlendMode,
CIColorClamp,
CIColorControls,
CIColorCrossPolynomial,
CIColorCube,
CIColorCubesMixedWithMask,
CIColorCubeWithColorSpace,
CIColorCurves,
CIColorDodgeBlendMode,
CIColorInvert,
CIColorMap,
CIColorMatrix,
CIColorMonochrome,
CIColorPolynomial,
CIColorPosterize,
CIColumnAverage,
CIComicEffect,
CIConstantColorGenerator,
CIConvolution3X3,
CIConvolution5X5,
CIConvolution7X7,
CIConvolution9Horizontal,
CIConvolution9Vertical,
CICopyMachineTransition,
CICrop,
CICrystallize,
CIDarkenBlendMode,
CIDepthBlurEffect,
CIDepthOfField,
CIDepthToDisparity,
CIDifferenceBlendMode,
CIDiscBlur,
CIDisintegrateWithMaskTransition,
CIDisparityToDepth,
CIDisplacementDistortion,
CIDissolveTransition,
CIDivideBlendMode,
CIDotScreen,
CIDroste,
CIEdgePreserveUpsampleFilter,
CIEdges,
CIEdgeWork,
CIEightfoldReflectedTile,
CIExclusionBlendMode,
CIExposureAdjust,
CIFalseColor,
CIFlashTransition,
CIFourfoldReflectedTile,
CIFourfoldRotatedTile,
CIFourfoldTranslatedTile,
CIGammaAdjust,
CIGaussianBlur,
CIGaussianGradient,
CIGlassDistortion,
CIGlassLozenge,
CIGlideReflectedTile,
CIGloom,
CIHardLightBlendMode,
CIHatchedScreen,
CIHeightFieldFromMask,
CIHexagonalPixellate,
CIHighlightShadowAdjust,
CIHistogramDisplayFilter,
CIHoleDistortion,
CIHueAdjust,
CIHueBlendMode,
CIHueSaturationValueGradient,
CIKaleidoscope,
CILabDeltaE,
CILanczosScaleTransform,
CILenticularHaloGenerator,
CILightenBlendMode,
CILightTunnel,
CILinearBurnBlendMode,
CILinearDodgeBlendMode,
CILinearGradient,
CILinearToSRGBToneCurve,
CILineOverlay,
CILineScreen,
CILuminosityBlendMode,
CIMaskedVariableBlur,
CIMaskToAlpha,
CIMaximumComponent,
CIMaximumCompositing,
CIMedianFilter,
CIMinimumComponent,
CIMinimumCompositing,
CIModTransition,
CIMorphologyGradient,
CIMorphologyMaximum,
CIMorphologyMinimum,
CIMotionBlur,
CIMultiplyBlendMode,
CIMultiplyCompositing,
CINinePartStretched,
CINinePartTiled,
CINoiseReduction,
CIOpTile,
CIOverlayBlendMode,
CIPageCurlTransition,
CIPageCurlWithShadowTransition,
CIParallelogramTile,
CIPDF417BarcodeGenerator,
CIPerspectiveCorrection,
CIPerspectiveTile,
CIPerspectiveTransform,
CIPerspectiveTransformWithExtent,
CIPhotoEffectChrome,
CIPhotoEffectFade,
CIPhotoEffectInstant,
CIPhotoEffectMono,
CIPhotoEffectNoir,
CIPhotoEffectProcess,
CIPhotoEffectTonal,
CIPhotoEffectTransfer,
CIPinchDistortion,
CIPinLightBlendMode,
CIPixellate,
CIPointillize,
CIQRCodeGenerator,
CIRadialGradient,
CIRandomGenerator,
CIRippleTransition,
*wAverage,
CISaturationBlendMode,
CIScreenBlendMode,
CISepiaTone,
CIShadedMaterial,
CISharpenLuminance,
CISixfoldReflectedTile,
CISixfoldRotatedTile,
CISmoothLinearGradient,
CISoftLightBlendMode,
CISourceAtopCompositing,
CISourceInCompositing,
CISourceOutCompositing,
CISourceOverCompositing,
CISpotColor,
CISpotLight,
CISRGBToneCurveToLinear,
CIStarShineGenerator,
CIStraightenFilter,
CIStretchCrop,
CIStripesGenerator,
CISubtractBlendMode,
CISunbeamsGenerator,
CISwipeTransition,
CITemperatureAndTint,
CITextImageGenerator,
CIThermal,
CIToneCurve,
CITorusLensDistortion,
CITriangleKaleidoscope,
CITriangleTile,
CITwelvefoldReflectedTile,
CITwirlDistortion,
CIUnsharpMask,
CIVibrance,
CIVignette,
CIVignetteEffect,
CIVortexDistortion,
CIWhitePointAdjust,
CIXRay,
CIZoomBlur
)
打印某个滤镜的详细信息
源文件detailFliterInfo.py
# coding: utf-8
from pycoreimage.pyci import *
print(cimg.inputs('gaussianBlur'))
print(cimg.inputs('additionCompositing'))
输出:
$ python python/PyCoreImage/src/detailFliterInfo.py
{
"CIAttributeFilterAvailable_Mac" = "10.4";
"CIAttributeFilterAvailable_iOS" = 6;
CIAttributeFilterCategories = (
CICategoryBlur,
CICategoryStillImage,
CICategoryVideo,
CICategoryBuiltIn
);
CIAttributeFilterDisplayName = "Gaussian Blur";
CIAttributeFilterName = CIGaussianBlur;
CIAttributeReferenceDocumentation = "http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur";
inputImage = {
CIAttributeClass = CIImage;
CIAttributeDescription = "The image to use as an input image. For filters that also use a background image, this is the foreground image.";
CIAttributeDisplayName = Image;
CIAttributeType = CIAttributeTypeImage;
};
inputRadius = {
CIAttributeClass = NSNumber;
CIAttributeDefault = 10;
CIAttributeDescription = "The radius determines how many pixels are used to create the blur. The larger the radius, the blurrier the result.";
CIAttributeDisplayName = Radius;
CIAttributeIdentity = 0;
CIAttributeMin = 0;
CIAttributeSliderMax = 100;
CIAttributeSliderMin = 0;
CIAttributeType = CIAttributeTypeScalar;
};
}
{
"CIAttributeFilterAvailable_Mac" = "10.4";
"CIAttributeFilterAvailable_iOS" = 5;
CIAttributeFilterCategories = (
CICategoryCompositeOperation,
CICategoryVideo,
CICategoryStillImage,
CICategoryInterlaced,
CICategoryNonSquarePixels,
CICategoryHighDynamicRange,
CICategoryBuiltIn
);
CIAttributeFilterDisplayName = Addition;
CIAttributeFilterName = CIAdditionCompositing;
CIAttributeReferenceDocumentation = "http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIAdditionCompositing";
inputBackgroundImage = {
CIAttributeClass = CIImage;
CIAttributeDescription = "The image to use as a background image.";
CIAttributeDisplayName = "Background Image";
CIAttributeType = CIAttributeTypeImage;
};
inputImage = {
CIAttributeClass = CIImage;
CIAttributeDescription = "The image to use as an input image. For filters that also use a background image, this is the foreground image.";
CIAttributeDisplayName = Image;
CIAttributeType = CIAttributeTypeImage;
};
}
滤镜的详细信息和使用 OC 打印结果相同。
使用 zoomBlur 滤镜
源文件 CIZoomBlur.py
# coding: utf-8
from pycoreimage.pyci import *
# read imag file
filepath = '/Users/zx/Downloads/2018bugs/201807/0705/cheers_1440x960.heic'
img = cimg.fromFile(filepath)
# apply zoomBlur
r1 = img.zoomBlur()
r2 = img.zoomBlur(center=[500,500],amount=10)
#show images
show([img, r1,r2], title=['src', 'r1','r2'])
# https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/#//apple_ref/doc/filter/ci/CIZoomBlur
可以看到,使用滤镜的时候,参数名称有变化。
原来的 inputCenter,inputAmout 分别变为了center,amout.
使用 mono 滤镜
源文件 CIPhotoEffectMono.py
# coding: utf-8
from pycoreimage.pyci import *
# read imag file
filepath = '/Users/zx/Downloads/2018bugs/201807/0705/cheers_1440x960.heic'
img = cimg.fromFile(filepath)
# print filter info
print(cimg.inputs('photoEffectMono'))
# apply photoEffectMono
r = img.photoEffectMono()
#show images
show([img, r], title=['src', 'r'])
使用叠加率滤镜
源文件 CILightenBlendMode.py
# coding: utf-8
from pycoreimage.pyci import *
# read imag file
filepath = '/Users/zx/Downloads/2018bugs/201807/0705/cheers_1440x960.heic'
img = cimg.fromFile(filepath)
backgourdImg = cimg.fromFile('/Users/zx/Downloads/zx.jpg')
# apply
r1 = img.additionCompositing(backgroundImage=backgourdImg)
r2 = img.colorBlendMode(backgroundImage=backgourdImg)
r3 = img.colorBurnBlendMode(backgroundImage=backgourdImg)
r4 = img.colorDodgeBlendMode(backgroundImage=backgourdImg)
r5 = img.darkenBlendMode(backgroundImage=backgourdImg)
# = img.DifferenceBlendMode
# = img.DivideBlendMode
# = img.ExclusionBlendMode
# = img.HardLightBlendMode
# = img.HueBlendMode
# = img.LightenBlendMode
# = img.LinearBurnBlendMode
# = img.LinearDodgeBlendMode
# = img.LuminosityBlendMode
# = img.MaximumCompositing
# = img.MinimumCompositing
# = img.MultiplyBlendMode
# = img.MultiplyCompositing
# = img.OverlayBlendMode
# = img.PinLightBlendMode
# = img.SaturationBlendMode
# = img.ScreenBlendMode
# = img.SoftLightBlendMode
# = img.SourceAtopCompositing
# = img.SourceInCompositing
# = img.SourceOutCompositing
# = img.SourceOverCompositing
# = img.SubtractBlendMode
#show images
show([img,r1,r2,r3,r4,r5])
参考资料
- https://developer.apple.com/videos/play/wwdc2018/719/
- https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/
- https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_intro/ci_intro.html#//apple_ref/doc/uid/TP30001185