كيف يمكنك تحويل الصورة إلى أبيض وأسود في PHP

StackOverflow https://stackoverflow.com/questions/254388

  •  05-07-2019
  •  | 
  •  

سؤال

كيف يمكن تحويل الصورة إلى أبيض وأسود في PHP؟

ليس فقط تحويله إلى تدرج رمادي ولكن كل بكسل يتحول إلى اللون الأسود أو الأبيض؟

هل كانت مفيدة؟

المحلول

ببساطة حول اللون الرمادي إلى الأسود أو الأبيض.

float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;

نصائح أخرى

باستخدام PHP GD مكتبة:

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -100);

تحقق من تعليقات المستخدم في الرابط أعلاه لمزيد من الأمثلة.

يمكنك استخدام imagemagick، على افتراض أن مضيفك يدعمه.ما الوظيفة التي تريد استخدامها لتحديد ما إذا كان يجب أن يكون البكسل أسود أم أبيض؟

إذا كنت تنوي القيام بذلك بنفسك ، فستحتاج إلى تنفيذ ملف الخوارزمية المخلصة. ولكن كما @jonni يقول ، أن استخدام أداة موجودة سيكون أسهل بكثير؟

$rgb = imagecolorat($original, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8 ) & 0xFF;
        $b = $rgb & 0xFF;

        $gray = $r + $g + $b/3;
        if ($gray >0xFF) {$grey = 0xFFFFFF;}
        else { $grey=0x000000;}

هذه الوظيفة تعمل مثل السحر

    public function ImageToBlackAndWhite($im) {

    for ($x = imagesx($im); $x--;) {
        for ($y = imagesy($im); $y--;) {
            $rgb = imagecolorat($im, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8 ) & 0xFF;
            $b = $rgb & 0xFF;
            $gray = ($r + $g + $b) / 3;
            if ($gray < 0xFF) {

                imagesetpixel($im, $x, $y, 0xFFFFFF);
            }else
                imagesetpixel($im, $x, $y, 0x000000);
        }
    }

    imagefilter($im, IMG_FILTER_NEGATE);

}

لكل بكسل ، يجب تحويل من اللون إلى GreyScale - شيء مثل $ ray = $ Red * 0.299 + $ Green * 0.587 + $ Blue * 0.114 ؛ (هذه هي عوامل ترجيح NTSC ؛ توجد أوزان مماثلة أخرى. وهذا يحاكي استجابة العين المختلفة للألوان المختلفة).

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

ما عليك سوى أن تقارن كل بكسل بالقطعة تفقد الكثير من التفاصيل - أي أن المساحات المظلمة الكبيرة تصبح سوداء تمامًا - بحيث يمكنك الاحتفاظ بمزيد من المعلومات ، فيمكنك تصور. في الأساس ، ابدأ في الجزء العلوي الأيسر من الصورة: لكل بكسل أضف الخطأ (الفرق بين القيمة الأصلية والقيمة المعينة النهائية) للبكسل إلى اليسار وفوقًا قبل المقارنة بالقيمة القطع.

كن على دراية بأن القيام بذلك في PHP سيكون بطيئًا للغاية - فستكون أكثر من ذلك بكثير للعثور على مكتبة توفر ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top