Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C#: Bitmap, scale

12K
03 июня 2009 года
St0p
59 / / 15.04.2007
доброго времени суток.

Такая проблема:

есть картинка Bitmap произвольного размера. Надо уменьшить её размеры до
 
Код:
Int32 thumbWidth = 160;
Int32 thumbHeight = 120;

Уменьшить её получается, но если пропорции не 4 : 3, один из габаритов искажается, тоесть картинку тянет либо по высоте, либо по ширине. А надо, чтобы уменьшенная картинка помещалась по центру прямоугольника, а разница заливалась белым... Если кто-ть кинет пример кода подгона такой.. Ммм.. Неправильной картинки к указанным размерам, то с меня пиво при первом вашем появлении в Питере, 100%. Очень надо, прошу подсобите : )
Заранее благодарен.
50K
06 июня 2009 года
__no_token
1 / / 06.06.2009
На C# не пишу. Но вот код, содранный в CBuilder со станд. компонента Image в
Delphi:
Код:
int w, h, cw, ch;
   double xyaspect;
   TRect result;
// w := Picture.Width;
   w = FDelta;
   h = FPicture->Height;
   cw = ClientWidth;
   ch = ClientHeight;
   if (Stretch || (Proportional && ((w > cw) || (h > ch))))
   {
      if (Proportional && (w > 0) && (h > 0))
      {
         xyaspect = (double)w / h;
         if (w > h)
         {
            w = cw;
            h = (double)cw / xyaspect;
            if (h > ch)  // woops, too big
            {
               h = ch;
               w = (double)ch * xyaspect;
            }
         }
         else
         {
            h = ch;
            w = (double)ch * xyaspect;
            if (w > cw) // woops, too big
            {
               w = cw;
               h = (double)cw / xyaspect;
            }
         } // else
      } // if (Proportional && (w > 0) && (h > 0))
      else
      {
        w = cw;
        h = ch;
      }
   } // внешний if

   result.Left     = 0;
   result.Top      = 0;
   result.Right    = w;
   result.Bottom   = h;


Принцип, думаю, понятен. В твоём случае - cw, ch - это thumbWidth, thumbHeight,
соответственно.
А w, h - реальные размеры картинки.
Вся идея в выборе макс. стороны, вычислении xaspect и домножении/делении на него.

P.S.: В Питере я не бываю. Но мне скучно...
Так что, если это то, что нужно или если есть вопросы, то регистрируйся и спрашивай на http://artiomsoft.zx6.ru/phpbb/index.php
341
06 июня 2009 года
Der Meister
874 / / 21.12.2007
Цитата: St0p
Если кто-ть кинет пример кода подгона такой.. Ммм.. Неправильной картинки к указанным размерам, то с меня пиво при первом вашем появлении в Питере, 100%.

С вас появление меня в Питере.

Код:
Rectangle GetImageLayout(Size imageSize, Rectangle thumbRect)
{
    Size thumbSize = thumbRect.Size;

    double aspect = (double) thumbSize.Width / thumbSize.Height;

    double kx = (double) imageSize.Width / thumbSize.Width;
    double ky = (double) imageSize.Height / thumbSize.Height;

    if (kx > ky)
    {
        int height = (int) Math.Round(thumbSize.Width / aspect);
       
        int x = thumbRect.Left;
        int y = thumbRect.Top + (thumbSize.Height - height) / 2;

        return new Rectangle(new Point(x, y), new Size(thumbSize.Width, height));
    }
    else
    {
        int width = (int) Math.Round(aspect * thumbSize.Height);

        int x = thumbRect.Left + (thubmSize.Width - width) / 2;
        int y = thumbRect.Top;

        return new Rectangle(new Point(x, y), new Size(width, thumbSize.Height));
    }
}
Код не протестирован, ибо набросок свершён в браузере.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог