Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 3
GraphABC

Как перевести изображение в массив строк

10.12.2019, 17:44. Показов 882. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо написать программу , определяющую площадь зоны одного цвета на картинке, в области клика и на всей картинке в целом . Подумал что лучшим вариантом будет сделать так : пикселю со значениями RGB такими же как и тот в который кликнули присваивалось значение 0, другого цвета- 1 , когда программа будет совершать обход , по 1 она пройти не может, а наступив на 0 меняет его на 2, затем подсчитывать 2 и выводить ответ , но столкнулся с проблемой: как перевести изображение в массив строк.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2019, 17:44
Ответы с готовыми решениями:

Как перевести массив символов в массив строк и обратно?
Помогите пожалуйста. Как перевести массив символов в массив строк и обратно?

Как перевести массив строк в массив int
for (int i=0; i<str.size(); i++) { str=static_cast<int>(str); } есть vector <string> str; Оно не...

Как байты перевести в изображение?
Как байты перевести в изображение?

5
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
10.12.2019, 21:11
Цитата Сообщение от GDPriest Посмотреть сообщение
как перевести изображение в массив строк.
Вот в строки изображение переводить точно не надо. Это будет ужасно медленно.

Какое изображение - вы не сказали (да и на изображениях из GraphABC/GraphWPF это будет больно делать), поэтому сделаю с основным форматом из .Net - Bitmap.

Цвета пикселей можно получать и через .GetPixel, но эта функция вызывает .LockBits и затем .UnlockBits для каждого 1 пикселя, отчего для изображений, размером с экран - для варианта с .GetPixel понадобится несколько секунд.

Лучше делать .LockBits ручками и только 1 раз. Кроме примера из вложений - я протестировал на изображении 7.5к х 4к пикселей (с проведённой линией от 1 угла до другого). Насчитало 70к пикселей, всего за 200мс.
Pascal
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
{$reference System.Drawing.dll}
uses System;
uses System.Drawing;
uses System.Drawing.Imaging;
 
type
  Pixel = record
    val: integer;
  end;
 
function PixelAt(ptr: IntPtr): Pixel;
begin
  var p: ^Pixel := pointer(ptr);
  Result := p^;
end;
 
function AddPixel(x,y,w,h: integer; ptr: IntPtr; stride: integer; find: Pixel; skip, checked, add: HashSet<Point>): boolean;
begin
  if x<0 then exit;
  if y<0 then exit;
  if x>=w then exit;
  if y>=h then exit;
  var p := new Point(x,y);
  if skip.Contains(p) then exit;
  if not checked.Add(p) then exit;
  Result := (PixelAt(ptr + y*stride + x*4) = find) and add.Add(p);
end;
 
begin
  var b := new Bitmap('0.bmp');
  var (x,y) := ReadInteger2('x и y через пробел:');
  var (w,h) := (b.Width,b.Height);
  
  var bd := b.LockBits(new Rectangle(0,0,w,h), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
  
  // Координаты пикселей, которые прошли на предыдущей (перед последней) итерации
  // Надо чтоб не идти назад, в сторону проверенных раньше пикселей
  var PrevPts := new HashSet<Point>;
  
  // Координаты пикселей, которые прошли на последней итерации
  // Новые пиксели смотрит только среди прямо прилежащим к этим
  var LastPts := new HashSet<Point>;
  LastPts += new Point(x,y);
  
  var find := PixelAt(bd.Scan0 + y*bd.Stride + x*4);
  var count := 1;
  
  while LastPts.Count<>0 do
  begin
    // Координаты пикселей, проверенных на данной итерации
    // Надо чтоб 1 и тот же пиксель не проверять 2 раза
    var Checked := new HashSet<Point>;
    // Координаты пикселей, которые были добавлены на данной итерации
    var NewPts := new HashSet<Point>;
    
    foreach var p in LastPts do
    begin
      if AddPixel(p.X-1,p.Y, w,h, bd.Scan0,bd.Stride, find, PrevPts,Checked,NewPts) then count += 1;
      if AddPixel(p.X,p.Y-1, w,h, bd.Scan0,bd.Stride, find, PrevPts,Checked,NewPts) then count += 1;
      if AddPixel(p.X+1,p.Y, w,h, bd.Scan0,bd.Stride, find, PrevPts,Checked,NewPts) then count += 1;
      if AddPixel(p.X,p.Y+1, w,h, bd.Scan0,bd.Stride, find, PrevPts,Checked,NewPts) then count += 1;
    end;
    
    PrevPts := LastPts;
    LastPts := NewPts;
  end;
  
  b.UnlockBits(bd);
  count.Println;
end.
Изображение на котором тестировал приложил во вложениях. Оно сразу и с бубликом, на случай если вы думаете что такой подход будет ломаться от них.
А ваш подход ломается если в изображении есть несколько областей с одинаковым цветом. То есть их все считает, хоть они и не соединены.
Вложения
Тип файла: rar 0.rar (157 байт, 11 просмотров)
1
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 3
11.12.2019, 17:39  [ТС]
Выдает ошибку времени выполнения: недопустимый параметр на 30-ой строке.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
11.12.2019, 18:21
А догадаться что такое '0.bmp', не?
0
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 3
11.12.2019, 18:37  [ТС]
Я к сожалению новичок, и не отрезаю половину написанного )
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
11.12.2019, 18:58
Навыки программирования не нужны чтоб понять что это имя файла, который должен существовать чтоб быть "допустимым".
Ну а ещё можно было внимательно прочитать и понять что я приложил пример этого файла во вложениях.

Добавлено через 3 минуты
А вообще, из само собой разумеющегося - надо было в первую очередь навести мышку на new Bitmap и прочитать во всплывающем окне что оно делает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2019, 18:58
Помогаю со студенческими работами здесь

Как перевести изображение в двоичный код и обратно?
УВАЖАЕМЫЕ ТОВАРИЩИ! Подскажите, пожалуйста или лучше объясните как нужно написать код программки . Есть исходный файл в виде картинки. ...

Разбить строку на массив строк и перевести их все в нижний регистр
Подскажите пожалуйста, правильно ли выполнено задание Само задание Дана строка, которая содержит имена пользователей, разделенные...

Как максимально сжато (по весу) перевести изображение в текст или числа?
Напишите, пожалуйста, алгоритм. Хотим с другом организовать передачу картинок или даже видео по радио. Есть идея, брать каждый пиксель,...

Как перевести массив байт в массив символов, используя определённую кодировку?
Всем доброго времени суток, ув. форумчане! Делаю алгоритм LFSR, почти закончил. Но застопорился на вот таком этапе. У меня имеется...

Как мне перевести массив char, в котором хранятся через пробел слова, в массив string?
Есть у меня одномерный массив char, в котором хранятся через пробел слова, как мне перевести этот массив в массив string?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru