Считайте, что это дополнение к Reza Aghaei answer .
Специализированный класс, который предоставляет некоторые вспомогательные инструменты для определения коэффициента масштабирования выбора и переводит выборкоординаты с масштабированными Bitmap
координатами.
Эта версия предназначена только для увеличенных изображений.
Класс ZoomFactor
предоставляет следующие методы :
PointF TranslateZoomPosition(PointF Coordinates, SizeF ContainerSize, SizeF ImageSize)
:
возвращает PointF
переведенные координаты точкирасположение внутри Контейнера до положения Точки внутри Растрового изображения, увеличенного в контейнере.
RectangleF TranslateZoomSelection(RectangleF Selection, SizeF ContainerSize, SizeF ImageSize)
:
возвращает RectangleF
, представляющее выделение, созданное внутри Контейнера, переведенноек координатам растрового изображения.
RectangleF TranslateSelectionToZoomedSel(RectangleF SelectionRect, SizeF ContainerSize, SizeF ImageSize)
:
возвращает RectangleF
, представляющий предварительно выбранную область исходного растрового изображения, преобразованную в увеличенный фрагментИзображение внутри Контейнера.
PointF GetImageScaledOrigin(SizeF ContainerSize, SizeF ImageSize)
:
возвращает PointF
ссылку на масштабированные исходные координаты Изображения внутри Контейнера.
SizeF GetImageScaledSize(SizeF ContainerSize, SizeF ImageSize)
:
возвращает ссылку SizeF
на изображение при масштабировании внутри контейнера.
Пример использования, показывающий, как обрезать растровое изображение с помощью прямоугольника выбора, созданного внутри элемента управления «Контейнер».Метод TranslateZoomSelection
возвращает раздел Bitmap, соответствующий области выбора:
ZoomFactor ZoomHelper = new ZoomFactor()
Bitmap originalBitmap;
RectangleF currentSelection = [Current Selection Rectangle];
RectangleF bitmapRect = ZoomHelper.TranslateZoomSelection(currentSelection, [Container].Size, originalBitmap.Size);
using (Bitmap croppedBitmap = new Bitmap((int)bitmapRect.Width, (int)bitmapRect.Height, originalBitmap.PixelFormat))
using (Graphics g = Graphics.FromImage(croppedBitmap))
{
g.DrawImage(originalBitmap, new Rectangle(Point.Empty, Size.Round(bitmapRect.Size)),
bitmapRect, GraphicsUnit.Pixel);
[Container].Image = (Bitmap)croppedBitmap.Clone();
}
Пример поведения, описанного выше :
Примечание : В этом примере предварительный выбор изображения в книжной ориентации инвертирует Width
и Height
Класс ZoomFactor
:
public class ZoomFactor
{
public ZoomFactor() { }
public PointF TranslateZoomPosition(PointF Coordinates, SizeF ContainerSize, SizeF ImageSize)
{
PointF imageOrigin = TranslateCoordinatesOrigin(Coordinates, ContainerSize, ImageSize);
float scaleFactor = GetScaleFactor(ContainerSize, ImageSize);
return new PointF(imageOrigin.X / scaleFactor, imageOrigin.Y / scaleFactor);
}
public RectangleF TranslateZoomSelection(RectangleF SelectionRect, SizeF ContainerSize, SizeF ImageSize)
{
PointF selectionTrueOrigin = TranslateZoomPosition(SelectionRect.Location, ContainerSize, ImageSize);
float scaleFactor = GetScaleFactor(ContainerSize, ImageSize);
SizeF selectionTrueSize = new SizeF(SelectionRect.Width / scaleFactor, SelectionRect.Height / scaleFactor);
return new RectangleF(selectionTrueOrigin, selectionTrueSize);
}
public RectangleF TranslateSelectionToZoomedSel(RectangleF SelectionRect, SizeF ContainerSize, SizeF ImageSize)
{
float scaleFactor = GetScaleFactor(ContainerSize, ImageSize);
RectangleF zoomedSelectionRect = new
RectangleF(SelectionRect.X * scaleFactor, SelectionRect.Y * scaleFactor,
SelectionRect.Width * scaleFactor, SelectionRect.Height * scaleFactor);
PointF imageScaledOrigin = GetImageScaledOrigin(ContainerSize, ImageSize);
zoomedSelectionRect.Location = new PointF(zoomedSelectionRect.Location.X + imageScaledOrigin.X,
zoomedSelectionRect.Location.Y + imageScaledOrigin.Y);
return zoomedSelectionRect;
}
public PointF TranslateCoordinatesOrigin(PointF Coordinates, SizeF ContainerSize, SizeF ImageSize)
{
PointF imageOrigin = GetImageScaledOrigin(ContainerSize, ImageSize);
return new PointF(Coordinates.X - imageOrigin.X, Coordinates.Y - imageOrigin.Y);
}
public PointF GetImageScaledOrigin(SizeF ContainerSize, SizeF ImageSize)
{
SizeF imageScaleSize = GetImageScaledSize(ContainerSize, ImageSize);
return new PointF((ContainerSize.Width - imageScaleSize.Width) / 2,
(ContainerSize.Height - imageScaleSize.Height) / 2);
}
public SizeF GetImageScaledSize(SizeF ContainerSize, SizeF ImageSize)
{
float scaleFactor = GetScaleFactor(ContainerSize, ImageSize);
return new SizeF(ImageSize.Width * scaleFactor, ImageSize.Height * scaleFactor);
}
internal float GetScaleFactor(SizeF Scaled, SizeF Original)
{
return (Original.Width > Original.Height) ? (Scaled.Width / Original.Width)
: (Scaled.Height / Original.Height);
}
}