Int32 thumbWidth = 160;
Int32 thumbHeight = 120;
C#: Bitmap, scale
Такая проблема:
есть картинка Bitmap произвольного размера. Надо уменьшить её размеры до
Код:
Уменьшить её получается, но если пропорции не 4 : 3, один из габаритов искажается, тоесть картинку тянет либо по высоте, либо по ширине. А надо, чтобы уменьшенная картинка помещалась по центру прямоугольника, а разница заливалась белым... Если кто-ть кинет пример кода подгона такой.. Ммм.. Неправильной картинки к указанным размерам, то с меня пиво при первом вашем появлении в Питере, 100%. Очень надо, прошу подсобите : )
Заранее благодарен.
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;
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
Цитата: 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));
}
}
{
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));
}
}