Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832

Работа со scanline

30.09.2016, 15:02. Показов 3938. Ответов 12

Студворк — интернет-сервис помощи студентам
Так и не смог разобраться как работать со scanline. Его посоветовали, т. к. GetPixel очень сильно лагает при сложных операциях.
Есть Image1. Как из точки X = 40, Y = 50 вытащить коды цветов R, G, B и поместить в integer?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2016, 15:02
Ответы с готовыми решениями:

ScanLine - свойство класса TBitmap->scanline[]
уважаемое сообщество не могу составить себе чёткое представление о ScanLine нет нигде толкового описания. ScanLine-это указатель на...

ScanLine
всем доброго времени суток уменя такая проблема уже второй день жыву в гугле ищу информацыю отом как пользоватся ScanLine нашол много...

Scanline
Здравствуйте, пытаясь понять принципы работы великого и ужасного Scanline,возникла проблема с освобождением памяти. type PRGBArray...

12
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
30.09.2016, 15:40
Для одной точки сойдёт и "Canvas->Pixels[40, 50]", который по сути вызывает тот же самый GetPixel().
Проблема будет если надо очень много точек тыкать. Версия IDE?
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
30.09.2016, 15:44  [ТС]
c++ builder 6. В том то и дело что очень много точек, да еще и в цикле. Частота обновления результатов 50-100 мсек, что очень долго. Поэтому getpixel не подходит
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
30.09.2016, 15:46
Сперва попробуйте установить TPNGImage и переделать с ним. Обычно помогает без всяких танцев с бубнами.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
30.09.2016, 15:50  [ТС]
1. не подскажете где скачать для 6-го билдера?
2. в pngimage getpixel работает по аналогии?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
30.09.2016, 15:59
Модуль PNGImage, класс TPNGObject (позже был переименован как TPNGImage, но это уже не для CB6): http://delphidevelop.ru/publ/12-1-0-174 (там в справке написано как ставить)

C++
1
2
TPNGObject->Canvas->Pixels[40, 50]; // То же что и "TBitmap->Canvas->Pixels[40, 50]", медленно;
TPNGObject->Pixels[40, 50]; // А вот это должно работать как надо;
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
30.09.2016, 16:05  [ТС]
Тоесть он уже есть в CB6?
На формочках не нахожу этот объект. Как его создать?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
30.09.2016, 16:27
Говорю же "там написано как ставить" - ну наверное его нету, если надо ставить? С:
После установки как-то так:
C++
1
2
3
4
5
TPNGObject * pngImage = new TPNGObject;
...
pngImage->Assign(bmpImage); // (Image1->Picture->Graphic);
...
delete pngImage;
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
30.09.2016, 16:42  [ТС]
Как все сложно.. Никогда не устанавливал доп модули.
1. кидать в папку проекта папку из архива или то что внутри папки?
2. Написано "В секцию uses проекта добавляем pngimage". Где эта секция? Как ее вызвать?
0
9 / 9 / 6
Регистрация: 14.09.2016
Сообщений: 41
01.10.2016, 07:13
ziqp, бедняга, зачем тебе TPNGImage.
Вот, что тебе нужно:
C++
1
2
3
4
5
6
7
8
9
10
11
for( int y = 0; y < Image1->Picture->Bitmap->Height; y++ )
{
    Byte *ptr  = (Byte *)Image1->Picture->Bitmap->ScanLine[y];
 
    for( int x = 0, j = 0; x < Image1->Picture->Bitmap->Width; x++ )
    {
        int BlueColor  = ptr[j++];
        int GreenColor = ptr[j++];
        int RedColor   = ptr[j++];
    }
}
Только надо проконтролировать, чтобы в Image1 находилась именно битовая матрица, а не Icon и не Metafille.
И чтобы Image1->Picture->Bitmap->PixelFormat был == pf24bit
Успехов!
1
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
01.10.2016, 13:47  [ТС]
Спасибо! Можно код для поиска точки x 50 y 40 чтобы увидеть что меняется?

Добавлено через 19 минут
Получается для точки x = 1 y = 1 код такой?
C++
1
2
3
4
Byte *ptr  = (Byte *)Image1->Picture->Bitmap->ScanLine[1];
int BlueColor  = ptr[1];
int GreenColor = ptr[2];
int RedColor   = ptr[3];
А для x = 2 y = 1 такой?
C++
1
2
3
4
Byte *ptr  = (Byte *)Image1->Picture->Bitmap->ScanLine[1];
int BlueColor  = ptr[4];
int GreenColor = ptr[5];
int RedColor   = ptr[6];
0
9 / 9 / 6
Регистрация: 14.09.2016
Сообщений: 41
01.10.2016, 13:53
Лучший ответ Сообщение было отмечено ziqp как решение

Решение

ziqp, Если ты хочешь в Bitmap загрузить картинку из Image1,
то надо сделать наоборот, лучше всего так:
C++
1
2
Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
Bitmap->Assign(Image1->Picture->Graphic);
То есть в свойстве Graphic класса TPicture точно находится графический объект, будь то матрица, значок или метафайл, и этот графический объект точно перейдёт в Bitmap
При этом в Image1 уже должна быть картинка, загруженная либо через инспектор объектов, либо через LoadFromFile()
Кстати, если ты пишешь в функции класса Form1, то можно не писать Form1->Image1, достаточно просто Image1
Получается для точки x = 1 y = 1 код такой?
Надо знать откуда ты считаешь координаты точки с нуля или единицы.
Левый верхний угол - это x = 0 y = 0, Справа следующая точка x = 1 y = 0
Точка ниже левого верхнего угла x = 0 y = 1
Если ты спрашиваешь про левый верхний угол, то
C++
1
2
3
4
Byte *ptr  = (Byte *)Image1->Picture->Bitmap->ScanLine[0];
int BlueColor  = ptr[0];
int GreenColor = ptr[1];
int RedColor   = ptr[2];
Если про точку ниже и правее левого верхнего угла ( x = 1 y = 1)
C++
1
2
3
4
Byte *ptr  = (Byte *)Image1->Picture->Bitmap->ScanLine[1];
int BlueColor  = ptr[3];
int GreenColor = ptr[4];
int RedColor   = ptr[5];
И ещё раз тебе напоминаю проверь:
C++
1
2
3
4
if( Image1->Picture->Bitmap->PixelFormat == pf24bit )
{
    //...
}
Успехов!
1
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
01.10.2016, 14:09  [ТС]
Спасибо большое! Сейчас исправил ошибки и все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2016, 14:09
Помогаю со студенческими работами здесь

ScanLine не сканлайнит
Здравствуйте! Пытаюсь преобразовать картинки одного из векторов в серые. (имеются 2 вектора с одинаковыми изображениями) ...

Jpeg & ScanLine
Простая задача: загрузить в 2 TImage 2 jpg-картинки из файлов и сравнить их, например, статистически (max, min, mean...). Значит,...

ScanLine работает некорректно
Здравсвтуйте, вот такая функция: void __fastcall TForm1::Button1Click(TObject *Sender) { Graphics::TBitmap *pBitmap = new...

Цвет пикселя scanline
Здравствуйте, начал изучать делфи, взял стандартную задачку, найти на картинке нужный пиксель, по легкому пути через Canvas не пошел, ...

BMP, ScanLine, Delphi
Доброго всем времени суток. Сразу говорю с графикой никогда не работал Понадобилось периодически проверять есть ли на экране...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru