GetPixel
медленный по двум причинам:
GetPixel
приводит к транзакции к видеодрайверу, который, в свою очередь, принимает данные пикселя из видеопамяти. GetPixel
выполняет несколько действий, включая обрезание / преобразование координат и т. Д. Итак, если вы используете для запроса многих значений пикселей сразу - вы должны попытаться организовать это в одной транзакции с драйвером GDI / video.
Используя GDI, вы должны создать DIB соответствующего размера (см. CreateDIBSection
). После создания вам будет предоставлен прямой указатель на данные битов изображения. Затем скопируйте часть изображения на ваш DIB (см. [D5] BitBlt ). Также не забудьте вызвать GdiFlush
, прежде чем вы действительно проверите содержимое DIB (так как видеодрайверы могут делать асинхронный рисунок).
Используя GD +, вы можете сделать то же самое, с немного более простым синтаксисом.
Вы можете поместить такие вещи в окне просмотра, чтобы упростить масштабирование, что-то вроде этого. Вам нужно будет удалить панель стека, она будет складывать элементы один поверх другого, что не то, что вы здесь. В этом случае я использовал сетку.
<Viewbox Width="100" Height="100">
<Grid Width="20" Height="20">
<Ellipse Stroke="Black"/>
<TextBlock HorizontalAlignment="Center" Text="i" TextAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Viewbox>
[/g0]
Таким образом, стековая панель поместит первый элемент вверху, второй чуть ниже его, третий ниже второго и т. д. Вы можете использовать Canvas или Grid. Подобно панели стека, они являются «элементами управления контентом» и поддерживают размещение внутри них нескольких объектов, как это было сделано со стековой панелью.
Итак, действительно быстрый способ сделать то, что вы пытаетесь выполнить, будет таким:
<Grid >
<Ellipse HorizontalAlignment="Left" Height="52" Stroke="Black" VerticalAlignment="Top" Width="52"/>
<TextBlock Text="i" FontSize="52" Margin="18,-13,-6,13" />
</Grid>
Или вы можете использовать символ юникода: ⓘ
код 0x24D8
<TextBlock Text="ⓘ" FontSize="52" />
Не используйте StackPanel для этого, цель состоит в том, чтобы стекать вещи, а не показывать их перекрывающимися, вы используете для этого неправильный инструмент. Используйте Grid, это намного больше подходит для того, что вы пытаетесь сделать.
Чтобы иметь прозрачный фон, вам необходимо либо установить свойство Text [[x]] фона TextBlock , либо «Прозрачный», или установите нулевой фон. Background={x:Null}