在我們的 CamanJS 影像編輯器系列的第一個教學中,我們僅使用內建濾鏡來編輯影像。這限制了我們一些基本效果,如亮度、對比度和 18 個其他更複雜的濾鏡,如 Vintage、Sunrise 等。它們都很容易應用,但我們無法完全控制我們想要的圖像的各個像素進行編輯。
在第二個教程中,我們了解了圖層和混合模式,這使我們能夠更好地控制正在編輯的圖像。例如,您可以在畫布上新增一個新圖層,用顏色或圖像填滿它,然後將其放置在父圖層上並套用混合模式。然而,我們仍然沒有創建自己的過濾器,並且我們可以應用的混合模式僅限於 CamanJS 已經提供的模式。
本教學的目的是教您如何創建自己的混合模式和濾鏡。我們還將解決庫中存在的一些錯誤,以及在您自己的專案中使用 CamanJS 時如何修補它們。
建立新的混合模式
預設情況下,CamanJS 提供十種混合模式。它們是正常、相乘、屏蔽、疊加、差值、加法、排除、柔光、變亮和變暗。該庫還允許您註冊自己的混合模式。這樣,您就可以控制當前圖層和父圖層的相應像素如何混合在一起以產生最終結果。
您可以使用 Caman.Blender.register("blend_mode", callback);
建立新的混合模式。此處,blend_mode
是您要用來識別您正在建立的混合模式的名稱。回呼函數接受兩個參數,其中包含目前圖層上不同像素和父圖層上對應像素的 RGB 值。該函數傳回一個對象,其中包含 rgb
通道的最終值。
下面是自訂混合模式的範例,如果父圖層中對應像素的通道值超過 128,則該像素的各個通道的值設定為 255。如果該值低於 128,則最終通道值是父通道值減去目前層通道值的結果。此混合模式的名稱是 maxrgb
。
Caman.Blender.register("maxrgb", function(rgbaLayer, rgbaParent) { return { r: rgbaParent.r > 128 ? 255 : rgbaParent.r - rgbaLayer.r, g: rgbaParent.g > 128 ? 255 : rgbaParent.g - rgbaLayer.g, b: rgbaParent.b > 128 ? 255: rgbaParent.b - rgbaLayer.b }; });
讓我們以類似的方式創建另一個混合模式。這次,如果父層對應像素的通道值大於128,則最終的通道值將會被設定為0。如果父層的通道值小於128,則最終結果將是相加特定像素的目前圖層和父圖層的通道值。此混合模式已命名為 minrgb
。
Caman.Blender.register("minrgb", function(rgbaLayer, rgbaParent) { return { r: rgbaParent.r < 128 ? rgbaParent.r + rgbaLayer.r : 0, g: rgbaParent.g < 128 ? rgbaParent.g + rgbaLayer.r : 0, b: rgbaParent.b < 128 ? rgbaParent.r + rgbaLayer.r : 0 }; });
您應該嘗試建立自己的混合模式進行練習。
建立新的基於像素的濾波器
CamanJS 中有兩大類別過濾器。您可以一次對整個影像進行一個像素操作,也可以使用卷積核修改影像。卷積核是一個矩陣,它根據某個像素周圍的像素來決定該像素的顏色。在本節中,我們將重點放在基於像素的濾波器。內核操作將在下一節中介紹。
基於像素的濾鏡一次給出一個像素的 RGB 通道值。該特定像素的最終 RGB 值不受周圍像素的影響。您可以使用 Caman.Filter.register("filter_name", callback);
建立自己的篩選器。您建立的任何篩選器都必須呼叫 process()
方法。此方法接受過濾器名稱和回調函數作為參數。
以下程式碼片段向您展示如何建立基於像素的濾鏡,將影像變成灰階。這是透過計算每個像素的發光,然後將各個通道的值設為等於計算的發光來完成的。
Caman.Filter.register("grayscale", function () { this.process("grayscale", function (rgba) { var lumin = (0.2126 * rgba.r) + (0.7152 * rgba.g) + (0.0722 * rgba.b); rgba.r = lumin; rgba.g = lumin; rgba.b = lumin; }); return this; });
您可以以類似的方式建立閾值篩選器。這次,我們將允許用戶通過一個閾值。如果特定像素的亮度高於使用者提供的限制,則該像素將變成白色。如果特定像素的亮度低於使用者提供的限制,則該像素將變黑。
Caman.Filter.register("threshold", function (limit) { this.process("threshold", function (rgba) { var lumin = (0.2126 * rgba.r) + (0.7152 * rgba.g) + (0.0722 * rgba.b); rgba.r = lumin > limit ? 255 : 0; rgba.g = lumin > limit ? 255 : 0; rgba.b = lumin > limit ? 255 : 0; }); return this; });
作為練習,您應該嘗試建立自己的基於像素的過濾器,例如,增加所有像素上特定通道的值。
CamanJS 還允許您設定絕對和相對位置像素的顏色,而不是操縱目前像素的顏色。不幸的是,這種行為有點錯誤,所以我們必須重寫一些方法。如果您查看該程式庫的原始程式碼,您會注意到getPixel()
和putPixel()
等方法呼叫了 方法<code class="inline">this
上的 和 上的 和。但是,這些方法不是在原型上定義的,而是在類別本身上定義的。
這個函式庫的另一個問題是 putPixelRelative()
方法在兩個不同的地方使用變數名稱 nowLoc
而不是 newLoc
。您可以透過在腳本中新增以下程式碼來解決這兩個問題。
Caman.Pixel.prototype.coordinatesToLocation = Caman.Pixel.coordinatesToLocation Caman.Pixel.prototype.locationToCoordinates = Caman.Pixel.locationToCoordinates Caman.Pixel.prototype.putPixelRelative = function (horiz, vert, rgba) { var newLoc; if (this.c == null) { throw "Requires a CamanJS context"; } newLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz); if (newLoc > this.c.pixelData.length || newLoc < 0) { return; } this.c.pixelData[newLoc] = rgba.r; this.c.pixelData[newLoc + 1] = rgba.g; this.c.pixelData[newLoc + 2] = rgba.b; this.c.pixelData[newLoc + 3] = rgba.a; return true; };
更正代码后,您现在应该能够创建依赖于 putPixelRelative()
的过滤器,没有任何问题。这是我创建的一个这样的过滤器。
Caman.Filter.register("erased", function (adjust) { this.process("erased", function (rgba) { if(Math.random() < 0.25) { rgba.putPixelRelative(2, 2, { r: 255, g: 255, b: 255, a: 255 }); } }); return this; });
此过滤器将当前像素向上两行和右侧两列的像素值随机设置为白色。这会擦除部分图像。这就是过滤器名称的由来。
创建新的基于内核操作的过滤器
正如我之前提到的,CamanJS 允许您创建自定义滤镜,其中当前像素的颜色由其周围的像素决定。基本上,这些滤镜会遍历您正在编辑的图像中的每个像素。图像中的一个像素将被其他八个像素包围。图像中这九个像素的值乘以卷积矩阵的相应条目。然后将所有这些乘积加在一起以获得像素的最终颜色值。您可以在 GIMP 文档中更详细地了解该过程。
就像基于像素的过滤器一样,您可以使用 Caman.Filter.register("filter_name", callback);
定义自己的内核操作过滤器。唯一的区别是您现在将在回调函数内调用 processKernel()
。
这是使用内核操作创建浮雕过滤器的示例。
Caman.Filter.register("emboss", function () { this.processKernel("emboss", [ -2, -1, 0, -1, 1, 1, 0, 1, 2 ]); });
以下 CodePen 演示将展示我们在本教程中创建的所有过滤器的实际操作。
最终想法
在本系列中,我几乎涵盖了 CamanJS 在基于画布的图像编辑方面提供的所有内容。您现在应该能够使用所有内置滤镜、创建新图层、在这些图层上应用混合模式以及定义您自己的混合模式和滤镜功能。
您还可以浏览 CamanJS 网站上的指南,以了解我可能错过的任何内容。我还建议您阅读该库的源代码,以了解有关图像处理的更多信息。这也将帮助您发现库中的任何其他错误。
以上是使用 CamanJS 開發自訂影像編輯器:擴展濾鏡選項和混合模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

能在三天內學會WordPress。 1.掌握基礎知識,如主題、插件等。 2.理解核心功能,包括安裝和工作原理。 3.通過示例學習基本和高級用法。 4.了解調試技巧和性能優化建議。

WordPress是內容管理系統(CMS)。它提供內容管理、用戶管理、主題和插件功能,支持創建和管理網站內容。其工作原理包括數據庫管理、模板系統和插件架構,適用於從博客到企業網站的各種需求。

wordpressgood forvortalyanewebprojectDuetoItsAsatilityAsacms.itexcelsin:1)用戶友好性,允許Aeserywebsitesetup; 2)sexibility andcustomized andcustomization and numerthemesandplugins; 3)seoop timigimization; and4)and4)

Wix適合沒有編程經驗的用戶,WordPress適合希望有更多控制和擴展能力的用戶。 1)Wix提供拖放式編輯器和豐富模板,易於快速搭建網站。 2)WordPress作為開源CMS,擁有龐大社區和插件生態,支持深度自定義和擴展。

WordPress本身免費,但使用需額外費用:1.WordPress.com提供從免費到付費的套餐,價格從每月幾美元到幾十美元不等;2.WordPress.org需購買域名(每年10-20美元)和託管服務(每月5-50美元);3.插件和主題多數免費,付費的價格在幾十到幾百美元之間;通過選擇合適的託管服務、合理使用插件和主題、定期維護和優化,可以有效控制和優化WordPress的成本。

WordPress核心版本是免費的,但使用過程中可能產生其他費用。 1.域名和託管服務需要付費。 2.高級主題和插件可能需要付費。 3.專業服務和高級功能可能需要付費。

WordPress對初學者來說容易上手。 1.登錄後台後,用戶界面直觀,簡潔的儀表板提供所有必要功能鏈接。 2.基本操作包括創建和編輯內容,所見即所得的編輯器簡化了內容創建。 3.初學者可以通過插件和主題擴展網站功能,學習曲線存在但可以通過實踐掌握。

人們選擇使用WordPress是因為其強大和靈活性。 1)WordPress是一個開源的CMS,易用性和可擴展性強,適合各種網站需求。 2)它有豐富的主題和插件,生態系統龐大,社區支持強大。 3)WordPress的工作原理基於主題、插件和核心功能,使用PHP和MySQL處理數據,支持性能優化。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。