-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328

Компоненты пикселя

12.04.2014, 06:02. Показов 8961. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Мне понадобилось получить массив пикселей изображения .bmp.
Полазил в справке Qt Creator, нашёл вот такой вот способ:
C++ (Qt)
1
 QVector<QRgb> QImage::colorTable () const.
Создал вектор и вызвал этот метод, но когда я беру компоненту синего, например, так
C++ (Qt)
1
int a = qBlue(*it);
, то почему то не у всех пикселей она есть, выводится 0, хотя изображение почти всё голубое.(также и для других компонент)
Что может быть не так?
пробывал для проверки считывания изображения сделать так:
сначала считываю
C++ (Qt)
1
QImage img2(fileName);
потом присваиваю:
C++ (Qt)
1
QImage img = img2;
потом сохраняю:
C++ (Qt)
1
img.save(fileName, "BMP");
всё робит, изображение точно такое же получается -> проблема неправильного считывания изображения отпадает.
Вот не нашёл метод проверить правильность получения вектора, может подскажете метод как из вектора QRgb сделать объект типа QImage.
Всем спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2014, 06:02
Ответы с готовыми решениями:

Цвет пикселя
Как узнать какого цвета пиксель?

Считывание цвета пикселя
Всем доброго времени суток! У меня есть окно программы: Есть код: QPixmap *p = new QPixmap; *p =...

Выделение пикселя на изображении QT
Добрый день. Возможно ли встроенными функциями выделить на изображении самый светлый участок и узнать его координаты?

32
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
21.04.2014, 17:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от танкист34 Посмотреть сообщение
а почему именно 16 ?
Читай выше по представлению RGB/ARGB. Это в 8-битах была таблица цветов, и оперировали номером цвета. Представление в десятичном в виде не очень удобное.
У QImage есть ряд конструкторов, для получения изображения из массива
C++ (Qt)
1
2
    QImage ( uchar * data, int width, int height, Format format )
    QImage ( const uchar * data, int width, int height, Format format )
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
21.04.2014, 18:05  [ТС]
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Читай выше по представлению RGB/ARGB
а что про представление читать: то что 8 бит отводится под каждую компоненту == это и определяет глубину цвета изображения.
В том примере который вы скинули не применяется метод bits.
Мне необходимо знать что именно возвращает bits, если перевести дословно, то получается, что он возвращает данные первого пикселя, но почему под данные всего 8 бит, если изображение с глубиной цвета 32 бита.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
22.04.2014, 13:50
Цитата Сообщение от танкист34 Посмотреть сообщение
В том примере который вы скинули не применяется метод bits.
потому что там удобно идти построчно для генерации изображения, иначе бы пришлось писать что то типа
data[width*j+i], что бы обратиться к пикселу по индексу j,i
Цитата Сообщение от танкист34 Посмотреть сообщение
Мне необходимо знать что именно возвращает bits, если перевести дословно, то получается, что он возвращает данные первого пикселя, но почему под данные всего 8 бит
наименьший размер данных байт и есть формат QImage::Format_Mono в котором 1 пиксел представлен 1 битом.

Само изображение хранится в одномерном массиве, для 24-32 бита это uint data[ширина*высота], для 8-бит char data[ширина*высота]. В Си массив это указатель на первый элемент, bits возвращает указатель на эту область памяти.
1
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
22.04.2014, 14:31  [ТС]
Dmitriy_M, спасибо, буду разбираться дальше
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
24.04.2014, 20:34  [ТС]
Dmitriy_M, дак вот, если идти построчно таким способом:
C++ (Qt)
1
2
3
4
5
//uchar * aaa = img.bits();
              uchar * aaa = img.scanLine(0);
              QRgb * uuu = (QRgb*)&aaa;
              QRgb red = qRed(*(uuu));
              ui->Zn_pixel_Browser->setText(QString::number(red, 10));
то каждый раз при открытии одной и той же картинки получается разные значения пикселя, не знаю почему так выходит.
Согласно спавке, если изображение с глубиной в 32 бита, то надо преобразовать указатель, что я и сделал. А дальше просто беру значение находящееся по этому адресу.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
25.04.2014, 10:43
танкист34, если правильно разобрал 3 строку, ты берешь адрес переменной aaa.
C++ (Qt)
1
2
uint * aaa = reinterpret_cast<uint*>(img.scanLine(0));
QRgb red = qRed(aaa[0]);
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
29.04.2014, 22:10  [ТС]
Dmitriy_M, вроде наваял функцию получения значения пикселей используя scanLine
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void MainWindow::data_pixels(QImage img) //получение значений пикселей изображени, используя scanLine(int);
{
    shirina = img.width();
    visota = img.height();
 
    for(int i = 0; i < shirina; i++)
    {
        uint * ptr_stroka = reinterpret_cast<uint*>(img.scanLine(i));
 
        for(int j = 0; j < visota; j++)
        {
            *ukazatel = *ptr_stroka;
            ptr_stroka++;
            ukazatel++;
        }
 
    }
 
}
C++ (Qt)
1
uint *ukazatel;
только как теперь получить назад изображение для проверки не знаю. Точнее не знаю как применить конструктор, данный вами выше.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
30.04.2014, 11:22
C++ (Qt)
1
QImage img2( reinterpret_cast<uchar*>(ukazatel), shirina, visota, img.format())
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
30.04.2014, 19:04  [ТС]
Dmitriy_M, вот так вот дописал в функцию
C++ (Qt)
1
2
3
QImage img2( reinterpret_cast<uchar*>(ukazatel), shirina, visota, img.format());
    QString fileName = QFileDialog::getSaveFileName(this, QString("Сохранить как..."), QString("./home"), QString("SAV (*.bmp)"));
    img2.save(fileName, 0, -1);
вылетает программа, когда начинаешь сохранять файл ex: с именем 1.bmp

считывал вот таким макаром:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void MainWindow::OpenFile()
{
    QString fileName = QFileDialog::getOpenFileName(this, QString("Открыть файл"), QString("./home"), QString("TXT (*.bmp)"));
    QFile file(fileName);
    if (file.open(QIODevice::ReadOnly))
          {
              QImage img(fileName);
              //massiv_color = vector_znach(img);
              data_pixels(img);
              file.close();
          }
 
}
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
30.04.2014, 20:37
танкист34, где и чем инициализируется ukazatel?
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
30.04.2014, 20:47  [ТС]
Dmitriy_M, я чуть выше скидывал:
C++ (Qt)
1
uint *ukazatel;// в классе MainWindow с модификатором public
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.05.2014, 12:35
Цитата Сообщение от танкист34 Посмотреть сообщение
чуть выше скидывал
просмотрел всю историю, ничего подобного.
У тебя тут баг на баге, ты вообще C++ знаешь?
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
01.05.2014, 13:12  [ТС]
Dmitriy_M, учусь учусь потихоньку, что за баг ? где?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.05.2014, 13:12

Считать цвет пикселя
Доброго времени суток, можно ли с помощью QT'a узнать какой пиксель по конкретным координатам экрана? (не в программе а в среде windows, к...

QBitmap получить цвет пикселя
Какой метод в QBitmap возвращает цвет пикселя(x,y) или возможно существует другой класс, который сможет это сделать?

Установить цвет пикселя в QGraphicsScene
QImage image(scene-&gt;sceneRect().size().toSize(), QImage::Format_ARGB32); image.fill(Qt::transparent); ...

Соотнесение цвета пикселя с заданными цветами
Доброго времени суток. Есть цвет пикселя (QRgb currPixelColor). Задача: идентифицировать цвет как представителя одного из слеюущих (помимо...

Какой функцией можно получить цвет пикселя в заданных координатах?
К примеру while (true) { QCursor::setPos(200, 200); //здесь получаем цвет пикселя if(color_at_position ==...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Опции темы

Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru