Advertisement
  1. Code
  2. JavaScript

إنشاء محرر الصور باستخدام CamanJS: إنشاء عوامل تصفية مخصصة وطرق المزج

Scroll to top
Read Time: 7 min
This post is part of a series called Creating an Image Editor Using CamanJS.
Creating an Image Editor Using CamanJS: Applying Basic Filters

Arabic (العربية/عربي) translation by Diangr (you can also view the original English article)

في البرنامج التعليمي الأول من سلسلة محرر الصورة CamanJS، استخدمنا فقط built-in filters to edit our images. وهذا تقتصر لنا بعض الآثار الأساسية مثل السطوع والتباين و 18 عوامل التصفية الأخرى أكثر تعقيداً مع أسماء مثل خمر، شروق الشمس، إلخ. كانت كلها من السهل أن تطبق، ولكن لم نكن في السيطرة الكاملة على وحدات البكسل الفردية لأننا نريد تحرير الصورة.

لقد تعلمنا في البرنامج التعليمي الثاني، وحول layers and blend modes، الذي قدم لنا المزيد من السيطرة على الصور ونحن تم تحرير. على سبيل المثال، يمكن إضافة طبقة جديدة في لوحة الرسم القماشية، وتعبئته بلون أو صورة، وثم ضعه فوق الطبقة الأصل مع وضع مزيج المطبق عليه. بيد أننا قد لا تزال لا إنشاء عوامل تصفية الخاصة بنا، ووسائط مزيج يمكن أن نطبق كانت تقتصر على تلك التي قدمتها بالفعل CamanJS.

سيكون الهدف من هذا البرنامج التعليمي ليعلمك كيفية إنشاء طرق المزج وعوامل التصفية الخاصة بك. وسنتناول أيضا بعض الأخطاء الموجودة في المكتبة، وكيف يمكن تصحيح لهم عند استخدام كامانجس في المشاريع الخاصة بك.

إنشاء وسائط مزيج جديد

بشكل افتراضي، يوفر CamanJS عشرة طرق المزج. هذه طبيعية، تتضاعف، الشاشة، تراكب، الفرق، إضافة، والاستبعاد، سوفتلايت، تفتيح وتغميق. المكتبة كما يسمح لك لتسجيل وسائط مزيج الخاصة بك. وبهذه الطريقة، يمكنك التحكم في كيفية بكسل المقابلة للطبقة الحالية والطبقة الأصل مزيج معا بغية تحقيق النتيجة النهائية.

يمكنك إنشاء وضع مزج جديد باستخدام Caman.Blender.register ("blend_mode" ، callback)؛ . هنا ، blend_mode هو الاسم الذي تريد استخدامه لتحديد وضع المزج الذي تقوم بإنشائه. وظيفة رد الاتصال يقبل معلمتين من معلمات التي تحتوي على قيم RGB لمختلفة في الطبقة الحالية والمقابله بكسل على الطبقة الأصل. تقوم الدالة بإرجاع كائن مع القيم النهائية لقنوات rgb.

هنا هو مثال على وضع مزيج المخصص الذي يقوم بتعيين قيمة القنوات الفردية بكسل إلى 255 إذا كانت قيمة هذه القناة للمقابلة بكسل في الطبقة الأصل أكثر من 128. إذا كانت القيمة أقل من 128 ، فإن قيمة القناة النهائية هي نتيجة لطرح قيمة قناة الطبقة الحالية من قيمة القناة الأم. اسم وضع المزج هذا هو maxrgb.

1
Caman.Blender.register("maxrgb", function(rgbaLayer, rgbaParent) {
2
    return {
3
        r: rgbaParent.r > 128 ? 255 : rgbaParent.r - rgbaLayer.r,
4
        g: rgbaParent.g > 128 ? 255 : rgbaParent.g - rgbaLayer.g,
5
        b: rgbaParent.b > 128 ? 255: rgbaParent.b - rgbaLayer.b
6
    };
7
});

لنقم بإنشاء وضع مزيج آخر بطريقة مماثلة. هذا الوقت، سيتم تعيين قيم القناة نهائياً إلى 0 إذا كانت قيمة القناة بكسل المقابلة في الطبقة الأصل أكبر من 128. إذا كانت قيمة القناة للطبقة الأصل أقل من 128، ستكون النتيجة النهائية إضافة قيم القناة للطبقة الحالية والطبقة الأصل بكسل خاص. وقد سمي هذا الوضع مزيج minrgb.

1
Caman.Blender.register("minrgb", function(rgbaLayer, rgbaParent) {
2
    return {
3
        r: rgbaParent.r < 128 ? rgbaParent.r + rgbaLayer.r : 0,
4
        g: rgbaParent.g < 128 ? rgbaParent.g + rgbaLayer.r : 0,
5
        b: rgbaParent.b < 128 ? rgbaParent.r + rgbaLayer.r : 0
6
    };
7
});

يجب محاولة وإنشاء الخاصة بك مزيج وسائط للممارسة.

إنشاء عوامل التصفية الجديدة المستندة إلى بكسل

وهناك فئتان عريضتان للمرشحات في CamanJS. يمكن أن تعمل أما على الصورة بأكملها بكسل واحد في وقت واحد، أو يمكنك تعديل صورة باستخدام نواة الالتواء. نواة الالتواء هو مصفوفة الذي يحدد لون البكسل معينة استناداً إلى بكسل حوله. في هذا القسم، سوف نركز على عوامل التصفية المستندة إلى بكسل. سوف تغطي نواة التلاعب في المقطع التالي.

ترد عوامل التصفية المستندة إلى بكسل قيمة قنوات RGB بكسل واحد في كل مرة. قيم RGB النهائي لتلك بكسل خاص لا تتأثر البيكسلات المحيطة. يمكنك إنشاء عوامل التصفية الخاصة بك باستخدام Caman.Filter.register ;("filter_name"،callback). أي عامل التصفية الذي قمت بإنشائه يجب استدعاء الأسلوب ()process. يقبل هذا الأسلوب اسم عامل التصفية ودالة رد اتصال كمعلمات.

أجزاء التعليمات البرمجية المتكررة التالية يوضح لك كيفية إنشاء عامل تصفية بكسل القائم الذي يحول الصور اللون الرمادي. يتم ذلك عن طريق حساب التﻷلؤ لكل بكسل وثم تعيين قيمة للقنوات الفردية لتكون مساوية التﻷلؤ المحسوبة.

1
Caman.Filter.register("grayscale", function () {
2
    this.process("grayscale", function (rgba) {
3
        var lumin = (0.2126 * rgba.r) + (0.7152 * rgba.g) + (0.0722 * rgba.b);
4
        rgba.r = lumin;
5
        rgba.g = lumin;
6
        rgba.b = lumin;
7
    });
8
    return this;
9
});

يمكنك إنشاء عامل تصفية عتبة بطريقة مماثلة. هذه المرة، ونحن سوف تسمح للمستخدمين لتمرير قيمة عتبة. إذا كانت الإضاءة بكسل خاص فوق الحد الأقصى المستخدم المقدمة، سوف تتحول تلك بكسل أبيض. إذا كانت الإضاءة بكسل خاص أقل من الحد الأقصى المستخدم المقدمة، سوف تتحول تلك بكسل سوداء.

1
Caman.Filter.register("threshold", function (limit) {
2
    this.process("threshold", function (rgba) {
3
        var lumin = (0.2126 * rgba.r) + (0.7152 * rgba.g) + (0.0722 * rgba.b);
4
        rgba.r = lumin > limit ? 255 : 0;
5
        rgba.g = lumin > limit ? 255 : 0;
6
        rgba.b = lumin > limit ? 255 : 0;
7
    });
8
    return this;
9
});

كممارسة، ينبغي أن نحاول وإنشاء الخاصة بك عوامل التصفية التي، على سبيل المثال، زيادة القيمة من أجل قناة معينة على كل بكسل بكسل القائم.

بدلاً من التعامل مع لون بكسل الحالية، CamanJS كما يسمح لك لتعيين لون بكسل في مواقع المطلق والنسبي. ولسوء الحظ، أن هذا السلوك little buggy، حيث سيتعين علينا إعادة كتابة بعض الأساليب. إذا نظرتم إلى التعليمات source code للمكتبة، ستلاحظ أن استدعاء أساليب مثل ()getPixel و ()putPixel بأساليب ()coordinatesToLocation و ()locationToCoordinates على this. ومع ذلك، لم يتم تحديد هذه الأساليب في النموذج ولكن في الفئة نفسها.

هناك مسألة أخرى مع المكتبة أن يستخدم الأسلوب ()putPixelRelative اسم المتغير  nowLoc بدلاً من newLoc في مكانين مختلفين. يمكنك الحصول على التخلص من هاتين المسألتين بإضافة التعليمة البرمجية التالية داخل البرنامج النصي الخاص بك.

1
Caman.Pixel.prototype.coordinatesToLocation = Caman.Pixel.coordinatesToLocation
2
Caman.Pixel.prototype.locationToCoordinates = Caman.Pixel.locationToCoordinates
3
4
Caman.Pixel.prototype.putPixelRelative = function (horiz, vert, rgba) {
5
    var newLoc;
6
    if (this.c == null) {
7
        throw "Requires a CamanJS context";
8
    }
9
    newLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz);
10
    if (newLoc > this.c.pixelData.length || newLoc < 0) {
11
        return;
12
    }
13
    this.c.pixelData[newLoc] = rgba.r;
14
    this.c.pixelData[newLoc + 1] = rgba.g;
15
    this.c.pixelData[newLoc + 2] = rgba.b;
16
    this.c.pixelData[newLoc + 3] = rgba.a;
17
    return true;
18
};

بعد تصحيح التعليمات البرمجية، يجب أن تكون قادراً على إنشاء عامل تصفية الذي يعتمد على ()putPixelRelative دون أي مشاكل الآن. هنا هو واحد مثل هذه التصفية التي تم إنشاؤها.

1
Caman.Filter.register("erased", function (adjust) {
2
    this.process("erased", function (rgba) {
3
        if(Math.random() < 0.25) {
4
        rgba.putPixelRelative(2, 2, {
5
            r: 255,
6
            g: 255,
7
            b: 255,
8
            a: 255
9
        });
10
        }
11
    });
12
    return this;
13
});

عامل التصفية هذا عشوائياً تعيين قيمة الصفوف اثنين بكسل أعلى وعمودين إلى حق بكسل الحالي إلى اللون الأبيض. وهذا بمسح أجزاء من الصورة. ومن ثم اسم عامل التصفية.

إنشاء جديد نواة التلاعب على أساس عوامل التصفية

وكما ذكرت سابقا، CamanJS يسمح لك لإنشاء عوامل تصفية مخصصة حيث يتم تحديد لون بكسل الحالية من البيكسلات المحيطة به. أساسا، تتجاوز هذه المرشحات كل بيكسل في الصورة التي تقوم بتحريرها. بكسل في الصورة سوف تكون محاطة بثمانية بكسل الأخرى. يتم ضرب قيم هذه البيكسلات تسعة من الصورة الإدخالات المقابلة من المصفوفة الالتواء. ثم يتم إضافة جميع هذه المنتجات معا للحصول على قيمة اللون النهائي بكسل. يمكنك أن تقرأ عن هذه العملية بمزيد من التفصيل في GIMP documentation.

تماما مثل عوامل تصفية تستند إلى بكسل، يمكنك تعريف مرشحات التلاعب kernel الخاص بك باستخدام Caman.Filter.register ("filter_name"، callback);. والفرق الوحيد هو أن الكلمة لك الآن ()processKernel داخل وظيفة رد الاتصال.

هنا مثال لإنشاء عامل تصفية مزخرف استخدام نواة التلاعب.

1
Caman.Filter.register("emboss", function () {
2
    this.processKernel("emboss", [
3
        -2, -1, 0,
4
        -1, 1, 1,
5
        0, 1, 2
6
    ]);
7
});

العرض التوضيحي التالي CodePen وسوف تظهر كافة عوامل التصفية التي أنشأنا في هذا البرنامج التعليمي في العمل.

خاطرة النهائي

في هذه السلسلة، وقد غطت تقريبا كل ما CamanJS العرض من حيث تحرير الصور المستندة إلى اللوحة القماشية. الآن يجب أن تكون قادراً على استخدام كافة عوامل التصفية المضمنة وإنشاء طبقات جديدة، وتطبيق طرق المزج على تلك الطبقات، وتحديد طرق المزج الخاصة بك وتصفية المهام.

يمكنك أيضا الانتقال من خلال guide على موقع كامانجس كي اقرأ أي شيء أنه ربما قد أخطأت. أود أن أوصى أيضا أن تقرأ التعليمات source code للمكتبة من أجل التعرف على المزيد حول التلاعب في الصورة. هذا سوف يساعد أيضا يمكنك الكشف عن أي أخطاء أخرى في المكتبة.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.