PyCoreImage

安装

首先,需要下载安装包,下载地址:

安装步骤:

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 the translate 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 the crop command:

img.rotate(radians)

保存

img.save('demo2.jpg')

显示

show(img, title='Demo 2: from file + slicing')

滤镜操作

打印所有的滤镜列表

所有的系统滤镜,从文档可以查到

https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_intro/ci_intro.html#//apple_ref/doc/uid/TP30001185

滤镜按照功能,被分进不同的类别

源文件 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,
CIRowAverage,
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])

参考资料

pyCoreImage Learn的更多相关文章

  1. Atitit learn by need 需要的时候学与预先学习知识图谱路线图

    Atitit learn by need 需要的时候学与预先学习知识图谱路线图 1. 体系化是什么 架构 知识图谱路线图思维导图的重要性11.1. 体系就是架构21.2. 只见树木不见森林21.3. ...

  2. Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

  3. [转载]VIM 教程:Learn Vim Progressively

    文章来源:http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/   Learn Vim Progressively   TL ...

  4. some tips learn from work experience

    1.you can't avoid office politics 2.you'll never have a job which you "can't quit" - if yo ...

  5. Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL

    没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...

  6. Learn RxJava

    Learn RxJava http://reactivex.io/documentation/operators.html https://github.com/ReactiveX/RxJava/wi ...

  7. ANSI Common Lisp Learn

    It has been a long time that I haven't dealt with my blog. On one hand I was preparing the exams.On ...

  8. [Notes] Learn Python2.7 From Python Tutorial

    I have planed to learn Python for many times. I have started to learn Python for many times . Howeve ...

  9. 十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))

    十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less)) 注:本文为翻译文章,因翻译水平有限,难免有缺漏不足之处,可查看原文. 我们知道写css代码是非常枯燥的 ...

随机推荐

  1. MySQL firstmatch strategy

    在探讨subquery如 x IN (SELECT XX FROM TABLE)这样的形式的MATCH策略时,不是很清楚实现过程.在网上搜了一下, 地址:http://stackoverflow.co ...

  2. 1418 抱歉 ACM 欧拉公式

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1418 思路:一看题目,明显是要求我们找规律,于是我就在草稿纸上画了很多个图像,还是没有找到规律,于是我就在 ...

  3. VirtWire 向客服发ticket

    1 首先需要登录自己的账户 2 点击网页的Open Ticket 3 选择要发送何种类型的ticket 4 写自己的问题,包括一个合适的主题,选择你发ticket是针对哪个vps(一个账户下可以ord ...

  4. css selector 用法

    html.css('a::attr(href)').extract()

  5. [NOI2014]起床困难综合征

    Description: 有n扇门,每扇门上有一个位运算符(&,|,^) 和一个权值,要求合理的选择一个不超过m的数,使其按顺序经过这些门的运算后最大 Hint: \(n \le 10^5\) ...

  6. Python中join 和 split详解(推荐)

    http://www.jb51.net/article/87700.htm python join 和 split方法简单的说是:join用来连接字符串,split恰好相反,拆分字符串的. .join ...

  7. Java第二课 项目的导入和导出

    Java项目的导入和导出 项目的导入和导出1)导入 右击myeclipse或eclipse的左侧有项目那一栏空白部分或者是File--Import,然后选择Import--General--双击Exi ...

  8. 和textrank4ZH代码一模一样的算法详细解读

    前不久做了有关自动文摘的学习,采用方法是TextRank算法,整理和大家分享. 一. 关于自动文摘 利用计算机将大量的文本进行处理,产生简洁.精炼内容的过程就是文本摘要,人们可通过阅读摘要来把握文本主 ...

  9. JS_高程7.函数表达式(2)递归

    递归函数:一个函数通过名字调用自身的情况构成的.eg: //递归实现阶乘 function factorial(num){ if(num <= 1){ return 1; }else{ retu ...

  10. SparkStreaming “Could not read data from write ahead log record” 报错分析解决

    # if open wal org.apache.spark.SparkException: Could not read data from write ahead log record FileB ...