Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 17

Определение границ заливки изображения

25.01.2015, 08:55. Показов 2938. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Подскажите, как можно определить границы рисунка для последующей работы с ними?
например, есть изображение с прозрачным фоном и его нужно обвести по контуру ( по границе с этой самой прозрачностью) на canvas и создать area.
надеюсь понятно написал, если нет, то задавайте необходимые вопросы -отвечу.
интересует предпочтительно решение на JS, но если есть иные - тоже предлагайте, буду рад всему.
Спасибо
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2015, 08:55
Ответы с готовыми решениями:

Определение позиции div'a относительно границ монитора
когда прокручиваем сайт, можно ли определить с помощью jquery находиться ли блок в приделе монитора, или еще нет? если да, то каким...

Ошибка заливки изображения
Добрый день! Столкнулся с такой проблемой. При заливке изображения в mathcad появляется ошибка (см скрин). Казалось бы дело в прописанном...

Сдвиг изображения после выполнения заливки региона окна
День добрый, Есть ситуация, когда в окне создается псевдо-кнопка, через CreateRectRgn, а потом заливается кистью, созданной...

6
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.01.2015, 16:37
danian, на canvas каждый пиксель имеет свой цвет в формате rgba. Получить его можно с помощью метода getImageData (возвращает сразу все пиксели). Вот отсюда и можно решать, какой пиксель какого цвета. К примеру если пиксель имеет какой то цвет, а рядом есть прозрачные пиксели, значит они являются границей... Но для этого придется канву изначально делать прозрачной. И мне кажется, слишком тяжелые расчеты будут. Может есть другие методы.
1
388 / 275 / 76
Регистрация: 19.09.2011
Сообщений: 828
26.01.2015, 22:12
у меня на флешах есть готовое.

тут 1873 фигуры и в сумме 60916 вершин. фигуры строятся 50мсек.
сегодня забыдлокодил обработку дырок, и короче оно жрет секунду, надо оптимайзить.
заодно есть код проверки наложения точки и этих фигур(во флешке точка меняет цвет если накладывается)

там код вида
ActionScript 3
1
2
3
4
5
6
7
8
9
10
stepIndex = stepIndex + 2 & 7;
stepX = steps[stepIndex];
stepY = steps[stepIndex + 1 | 0];
if (pixs[(y + stepY) * width + x + stepX | 0] === WHITE) {
    stepIndex = stepIndex + 6 & 7;
    stepX = steps[stepIndex];
    stepY = steps[stepIndex + 1 | 0];
}else {
    pols[pols.length - 1 | 0].push(new Point(x, y));
}
и нужно время что бы переписать на js, если не надо скажи сразу
Миниатюры
Определение границ заливки изображения  
Вложения
Тип файла: swf asd.swf (2.9 Кб, 5 просмотров)
1
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 17
27.01.2015, 12:38  [ТС]
нет, дружище, это не совсем то, но спасибо.
координаты границ я думаю вытащить методом getImageData, как и писалось выше.
останется только сократить количество точек через подобные(об этом подумаю, если у кого есть предложения - высказывайте), но пока нет времени на это
0
388 / 275 / 76
Регистрация: 19.09.2011
Сообщений: 828
27.01.2015, 13:00
danian, в смысле не то? есть какие то другие границы и другая прозрачность?

тебе нужно сделать что бы прозрачные области на картинке не кликались? и для этого ты хочешь юзать area?
0
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 17
28.01.2015, 08:48  [ТС]
Цитата Сообщение от nubideus Посмотреть сообщение
danian, в смысле не то? есть какие то другие границы и другая прозрачность?

тебе нужно сделать что бы прозрачные области на картинке не кликались? и для этого ты хочешь юзать area?
ну или я не совсем понял твое предложение. да, про area верно
0
388 / 275 / 76
Регистрация: 19.09.2011
Сообщений: 828
03.02.2015, 13:38
Лучший ответ Сообщение было отмечено danian как решение

Решение

http://jsbin.com/dukiwehalu/4

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
var getPolygons = function(image){
  var buffer = document.createElement("canvas").getContext("2d");
  buffer.canvas.width = image.width + 2;
  buffer.canvas.height = image.height + 2;
  
  buffer.save();
  buffer.fillStyle = "white";
  buffer.fillRect(0, 0, buffer.canvas.width, buffer.canvas.height);
  buffer.globalCompositeOperation = "destination-in";
  buffer.drawImage(image, 1, 1);
  buffer.restore();
  
  var data = buffer.getImageData(0, 0, buffer.canvas.width, buffer.canvas.height);
  var pixs = data.data;
  var pols = [];
  var steps = [
     0, -1,
     1,  0,
     0,  1,
    -1,  0,
  ];
  var walls = [
     1,  0,
     1,  1,
     0,  1,
     0,  0,
  ];
 
  var WHITE = 0xFFFFFFFF | 0;
  var BLACK = 0x00000000 | 0;
  var RED = 0xFFF00000 | 0;
  var SUBRED = 0x000F0000 | 0;
 
  var width = data.width;
  var len = data.width * data.height * 4;
 
  var inOpen = false;
  var outOpen = false;
  for (var i = 0; i < len; i += 4) {
    // noprotect
    var pix = (pixs[i] << 24) | (pixs[i + 1] << 16) | (pixs[i + 2] << 8) | (pixs[i + 3]);
    if (pix === SUBRED) {
      outOpen = true;
      inOpen = false;
    } else if (pix >>> 24 === 0) {
      outOpen = false;
      inOpen = false;
    } else {
      if (pix === RED){
        inOpen = true;
      }
      
      if (outOpen && inOpen) {
        continue;
      }
      outOpen = true;
      inOpen = true;
      var startX = (i >> 2) % width - 1;
      var startY = (i >> 2) / width | 0;
      var x = startX;
      var y = startY;
 
      pols.push([]);
 
      var stepIndex = 0;
      var stepX = steps[stepIndex];
      var stepY = steps[stepIndex + 1];
 
      for(;;) {
        x = x + stepX;
        y = y + stepY;
        if (pixs[(y * width + x) << 2]) {
          pixs.set([0xFF, 0xF0, 0, 0], (y * width + x) << 2);
          x = x - stepX;
          y = y - stepY;
          pixs.set([0, 0x0F, 0, 0], (y * width + x) << 2);
 
          pols[pols.length - 1].push(new Point(x + walls[stepIndex], y + walls[stepIndex + 1]));
 
          stepIndex = stepIndex + 6 & 7;
          stepX = steps[stepIndex];
          stepY = steps[stepIndex + 1];
        }else if (pixs[((y + stepX) * width + x - stepY) << 2]) {
          pixs.set([0xFF, 0xF0, 0, 0], ((y + stepX) * width + x - stepY) << 2);
          pixs.set([0, 0x0F, 0, 0], (y * width + x) << 2);
        }else {
          stepIndex = stepIndex + 2 & 7;
          stepX = steps[stepIndex];
          stepY = steps[stepIndex + 1];
          pols[pols.length - 1].push(new Point(x + walls[stepIndex], y + walls[stepIndex + 1]));
        }
        if (stepIndex === 0 && x === startX && y === startY) {
          break;
        }
      }
    }
  }
  
  for (i = 0; i < pols.length; i++ ) {
    var pol = pols[i];
    if (pol[0].x > pol[1].x && pol[0].y === pol[1].y) {
      var j = i - 1;
      for (; j >= 0; j-- ) {
        var isin = rectangleInOrthogonalPolygon(new Rectangle(pol[0].x + 0.5, pol[0].y + 0.5, 0, 0), pols[j]);
 
        if (isin !== -1) {
          pols.splice(pols.indexOf(pol), 1);
 
          var resPol = pols[j];
          var controlPoint = resPol[isin + 1];
 
          var newPol = [];// (pol.length + resPol.length + 2);
 
          var resPolIndex = 0;
          while (resPolIndex <= isin) {
            newPol.push(resPol[resPolIndex++]);
          }
          newPol.push(new Point(pol[0].x, controlPoint.y));
          for (var polIndex = 0; polIndex < pol.length; polIndex++ ) {
            newPol.push(pol[polIndex]);
          }
          newPol.push(new Point(pol[0].x, controlPoint.y));
          while (resPolIndex < resPol.length) {
            newPol.push(resPol[resPolIndex++]);
          }
          pols[j] = newPol;
          i--;
        }
      }
    }
  }
  pols.forEach(function(pol){
    pol.forEach(function(v){
      v.x -= 1;
      v.y -= 1;
    });
  });
  return pols;
};
 
var rectangleInOrthogonalPolygon = function(rect, pol) {
  var counter = 0;
  var result = -1;
  
  for (var vertexIndex = 0; vertexIndex < pol.length; vertexIndex++ ) {
    var s = pol[vertexIndex]; // s - start of line
    var e = pol[(vertexIndex + 1) % pol.length]; // e - end of line
    
    if (s.x > e.x) {
      s = e;
      e = pol[vertexIndex];
    }
    
    if (s.x <= rect.x + rect.width && rect.x <= e.x) {
      if (s.y > e.y) {
        s = e;
        e = pol[vertexIndex];
      }
      if (s.y <= rect.y + rect.height && rect.y <= e.y) {
        result = vertexIndex;
        return result;
      }else if (s.x !== e.x && rect.y > s.y && rect.x > s.x && rect.x <= e.x) {
        if (result !== -1 && Math.abs(rect.y - pol[result].y) > Math.abs(rect.y - e.y)) {
          result = vertexIndex;
        }
        if (result === -1) {
          result = vertexIndex;
        }
        counter++;
      }
    }
  }
  if (counter % 2) {
    return result;
  }else {
    result = -1;
  }
  
  return result;
};
на выходе ортогональный полигон.
оптимизируй этим http://habrahabr.ru/post/137852/
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2015, 13:38
Помогаю со студенческими работами здесь

Скрипт заливки изображения на хостинг + получения данных с него
Есть скрипт редактирования скинов minecraft( Игра на java). После редактирования скина происходит его сохранение на сайте imgun.com ...

Определение границ
2.определение границ y=x5-x3-x+2 х

Определение границ капчи
Добрый вечер Я пыталась написать программу, которая бы рисовала яркость пикселей Чтобы по ним определять возможные границы капчи ...

Определение границ цифр
Здравствуйте, подскажите, как можно определить границы цифр, по которым можно резать? Я пытался просто на 4 части, но цифры разного...

Определение границ типов данных
Задача такова. Требуется определить максимальные границы для основных типов данных, т.е. int, double, char, float. Вот набросал, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. fontSize": 18, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations":. . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru