2010-06-28 2 views
1

у меня есть, как, например, следующие два изображения:изображения - определяет выбор исходного изображения

http://img571.imageshack.us/i/spain.jpg/
http://img97.imageshack.us/i/spainoverlay.png/

Я хочу, чтобы загрузить вторые и обнаружить прозрачную области для использования в качестве выбор, к которому я могу применить некоторую обработку, но у меня нет первой подсказки, как начать. Я знаком с загрузкой изображений и рисования фигур и текста на них, но об этом.

Как я могу сделать обнаружение «волшебной палочки» на прозрачных областях, чтобы получить некоторый массив точек или другое определение области для манипуляций?

Редактировать: На втором изображении белые области на самом деле являются прозрачными областями. Они показывают белый цвет, благодаря цвету изображения imageshack.

ответ

1

Это, казалось бы, как простая проблема только отображения полного изображения карты, и отображения координат курсора при перемещении над этим образом, чтобы соответствующими координатами изображения маски. Здесь вы могли бы сделать две вещи. Сохраняйте изображение маски черно-белым и создавайте карту каждой области, связанную с чем-то, что определяет, что вы хотите делать, когда эта область зависает. Или, измените маску на многоцветное изображение и просто сопоставьте каждый цветовой код с тем, что определяет, что вы хотите делать, когда эта область зависает. Я лично выбрал бы последнее, поскольку это намного проще, и у вас будет примерно 16 миллионов возможных зон, которые можно было бы использовать (учитывая 24-битные цвета).

Учитывая простой тип отображения:

class ZoneMap 
{ 
    public Color MappedColor { get; set; } 
    public Action OnHover { get; set; } 
} 

Вы могли бы посмотреть отображенный зону путем перевода координат мыши исходного изображения с соответствующими координатами многоцветной карты зоны изображения на, посмотрите вверх по ZoneMap введите цвет и вызовите его действие OnHover:

var spainZones = new ZoneMap[] 
{ 
    new ZoneMap { MappedColor = Color.Red, OnHover = new Action(RedHandler) }, 
    new ZoneMap { MappedColor = Color.Blue, OnHover = new Action(BlueHandler) } 
} 

var color = getZoneColor(Mouse.X, Mouse.Y); // translate source mouse coords to colored zone map coords and get color 
var zone = spainZones.FirstOrDefault(zm => zm.MappedColor == color); 

zone.OnHover(); 

Я знаю, что это очень грубо. Если бы у меня появилось больше информации о том, что вы хотите делать при наведении определенной зоны, я мог бы предоставить больше.

+0

Это близко к тому, что я хочу, я думаю. Основная идея состоит в том, чтобы обработать отдельные области отчетливо (подумайте над головоломками). Конечный результат - это то, что делает warfish.net с их игровыми картами. Я хочу представить пользователю исходное изображение, обнаружить щелчок и сделать что-то со всеми соседними пикселями одного цвета (например, заполнить область цветом) – Chris

+0

Используя соседние пиксели того же цвета в соответствии с наложением, я имею в виду. Исходное исходное изображение предназначено только для презентаций - целью является наложение для определения областей действия изображения. – Chris

+0

@ Крис: Правильно, будет отображаться только исходное исходное изображение. Однако, пока изображение исходного изображения и изображение карты зоны имеют одинаковый размер, вы можете легко сопоставить координаты мыши при наведении на исходное изображение на изображение карты зоны. Когда у вас будет цвет зоны, поиск правильной записи ZoneMap по цвету и вызов ее действия OnHover будет довольно тривиальным. – jrista

0

Вы можете проверить, прозрачен ли пиксель, проверяя его альфа-значение (0 полностью прозрачно, 255 полностью непрозрачно) с Bitmap.GetPixel(), если объекты Bitmap - это то, что вы используете для загрузки изображений.

Если вам просто нужно что-то сделать с каждым прозрачным пикселом, я думаю, нет необходимости создавать выделение в отдельном объекте. Просто перебирайте пиксели, если вы прозрачны, делайте то, что вам нужно сделать.

Если вам нужно создать выделение, вы можете использовать отдельную растровую карту размером 1 бит на пиксель того же размера, что и исходное изображение. Белый представляет выбранную область, черный не выбран (или наоборот, ваш выбор).

См: http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx

Смежные вопросы