سؤال

منذ فترة طويلة أنشأت مكتبة صغيرة لتغيير حجم الصور باستخدام ImageMagick من خلال system(...) لأنني لم أشعر أن مهام بناء ImageMagick ل PHP كانت كافية.

ومع ذلك، فقد اضطررت مؤخرا إلى ميناء هذا إلى مشروع Symfony واخترت استخدام sfthumbnailplugin (إذا كنت أتذكر بشكل صحيح). هذا لسوء الحظ لم يتضمن وظيفة المحاصيل - أي تحديد الحجم المطلوب، على سبيل المثال 300x300 PX ولديه المصغرة اقتصاصها بحيث تناسبها. اخترت تنفيذ هذه الوظيفة بنفسي، ولكن يبدو أن هناك شيئا خاطئا.

كلما قمت بتغيير حجم الصورة إلى الحجم المطلوب، هناك عرض أكبر من الطول، وترد النسب. الق نظرة على هذا المثال: http://i37.tinypic.com/9hkqrl.png. - في هذا المثال، الصف العلوي هو النسب الصحيحة والصف السفلي هو المشكلة.

في المثال، كان يجب اقتصاص الجزء العلوي والسفلي.

فيما يلي رمز الجزء الذي يتم فيه إجراء المحصول (يجب أن تكون الأسماء المتغيرة تفسيرا ذاتيا):

<?php
    if ($width/$height > $this->maxWidth/$this->maxHeight) {
      // then resize to the new height...
                $command .= ' -resize "x'.$this->maxWidth.'"';

                // ... and get the middle part of the new image
                // what is the resized width?
                $resized_w = ($this->maxWidth/$height) * $width;

                // crop
                $command .= ' -crop "'.$this->maxHeight.'x'.$this->maxWidth.'+'.round(($resized_w - $this->maxWidth)/2).'+0"';
            } else {
                // or else resize to the new width
                $command .= ' -resize "'.$this->maxHeight.'x"';

                // ... and get the middle part of the new image
                // what is the resized height?
                $resized_h = ($this->maxHeight/$width) * $height;

                // crop
                $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
                             '+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
            }

هو الجزء الثاني من بيان IF الذي ينتج الرمز الخطأ.

هل يمكن لأي شخص تصحيح هذا بالنسبة لي؟ من الواضح أن الحسابات مخطئين.

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

المحلول

الحل كان ما يلي:

    if ($width/$height > $this->maxWidth/$this->maxHeight) {
      // then resize to the new height...
                $command .= ' -resize "x'.$this->maxHeight.'"';

                // ... and get the middle part of the new image
                // what is the resized width?
                $resized_w = ($this->maxHeight/$height) * $width;

                // crop
                $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.'+'.round(($resized_w - $this->maxWidth)/2).'+0" +repage';
            } else {
              $command .= ' -resize "' . $this->maxWidth . 'x"';
              $resized_h = ($this->maxWidth/$width) * $height;

                // crop
                $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
                             '+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
            }

نصائح أخرى

أقول اقتراح واحد يمكنك تجربته،

رأيت رابط الصورة، أعتقد أن الشروط لا يتم التحقق بشكل صحيح.

لقد فحصت الشرط (العرض / الارتفاع)> (Maxwidth / maxheight) بدلا من التحقق

إذا (العرض == الارتفاع) {}} (العرض> الارتفاع) {} (العرض <الارتفاع) {}

تحقق من هذا الشرط ووفقا لهذا الشرط اقطع الصورة وتغيير حجمها.

شكرا لك

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