سؤال

فعلى سبيل المثال ، إذا كنت بحاجة لملء المربع المحيط الذي هو 100px واسعة من قبل 50px طويل القامة ، الإدخال التالية الصور قد السلوك التالي:

  1. 200w x 200h يحصل على تخفيض 50% 25% تقطع أعلى ، السفلي.

  2. 200w x 100h يحصل على تخفيض 50% مع عدم الاقتصاص.

  3. 100w x 200h يحصل ليس تحجيمها ، ولكن 75px الحصول على قطع أعلى وأسفل.

هذا يبدو وكأنه سيكون مشتركا تغيير حجم وظيفة, ولكن لم أكن قادرا على تتبع سبيل المثال من الخوارزمية.

لن تقبل الإجابة في أي لغة بما في ذلك البرمجية الزائفة.رابط الصفحة مع الجواب هو رائع جدا!

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

المحلول

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

scale = max(maxwidth/oldwidth, maxheight/oldheight)
scaledwidth = oldwidth * scale
scaledheight = oldheight * scale
if scaledheight > maxheight:
    croptop = (scaledheight - maxheight) / 2
    cropbottom = (scaledheight - maxheight) - croptop
if scaledwidth > maxwidth:
    cropleft = (scaledwidth - maxwidth) / 2
    cropright = (scaledwidth - maxwidth) - cropleft

نصائح أخرى

هنا نتأكد من أن لدينا فقط حجم إذا كان X أكبر من 100%;ثم بعد أن نكون قد فعلت ذلك, علينا أن نضمن أننا فقط 50 بكسل على Y.إذا نحن أكبر من 50 ، ثم نأخذ الفرق والقسمة على 2 للحصول على كمية إزالتها من أعلى إلى أسفل.

double percent_x = 1.0;

if(X > 100) {
 percent_x = (float)100/X;
 X *= percent_x;
 Y *= percent_x;
}

int diff_y;
int top_cut, bott_cut;
if( Y > 50 ) {
 diff_y = (Y - 50) / 2;
 top_cut = bott_cut = diff_y;
}

إلى حد كبير مستوحاة من علامة فدية الجواب (شكرا جزيلا لك لقد أنقذت لي).لمن ترغب في القيام بذلك دون اقتصاص الصورة (فقط تدخل ضمن حدود), لقد وجدت أن هذه الأعمال:

if (maxWidth > width && maxHeight > height) {
  return { width, height };
}

aspectRatio = width / height,
scale       = max(maxWidth / width, maxHeight / height);

scaledHeight = height * scale,
scaledWidth  = width * scale;

if (scaledHeight > maxHeight) {
  scaledHeight = maxHeight;
  scaledWidth  = aspectRatio * scaledHeight;
} else if (scaledWidth > maxWidth) {
  scaledWidth  = maxWidth;
  scaledHeight = scaledWidth / aspectRatio;
}

return { scaledHeight, scaledWidth };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top