Допустим, у меня есть BitmapSource 1280x1024 в элементе управления WPF Image.В этом изображении есть «активная» область размером 100x100, которую я хочу увеличить с помощью нажатия кнопки.Я хочу максимально увеличить масштаб при сохранении соотношения сторон и сохранении всех «активных» пикселей видимыми.Вот что у меня есть:
XAML:
<DockPanel>
<Button DockPanel.Dock="Bottom" Content="Zoom" Click="Button_Click" />
<Border DockPanel.Dock="Top" ClipToBounds="True">
<Image Name="TheImage" />
</Border>
</DockPanel>
Код:
private const int WIDTH = 1280;
private const int HEIGHT = 1024;
private const int MIN_X = 100;
private const int MAX_X = 200;
private const int MIN_Y = 100;
private const int MAX_Y = 200;
public MainWindow()
{
InitializeComponent();
byte[] image = new byte[WIDTH * HEIGHT];
for (int y = MIN_Y; y <= MAX_Y; y++)
for (int x = MIN_X; x <= MAX_X; x++)
image[y * WIDTH + x] = byte.MaxValue;
TheImage.Source = BitmapSource.Create(WIDTH, HEIGHT, 96.0, 96.0, PixelFormats.Gray8, null, image, WIDTH);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
double factor = 1.0 / Math.Max((MAX_X - MIN_X) / (double)WIDTH, (MAX_Y - MIN_Y) / (double)HEIGHT);
Matrix matrix = Matrix.Identity;
matrix.ScaleAt(factor, factor, (MIN_X + MAX_X) / 2.0 / WIDTH * TheImage.ActualWidth, (MIN_Y + MAX_Y) / 2.0 / HEIGHT * TheImage.ActualHeight);
TheImage.RenderTransform = new MatrixTransform(matrix);
}
Вот как это выглядит до увеличения: ![before zoom](https://i.stack.imgur.com/PoL2J.png)
А вот после увеличения: ![after zoom](https://i.stack.imgur.com/9ZBTj.png)
Похоже, что масштаб является правильным, но я думаю, что проблема в том, что центрмасштабирование должно сместиться из-за масштабирования, но я не уверен, как учесть это заранее.