Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/41: Рейтинг темы: голосов - 41, средняя оценка - 4.51
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328

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

12.04.2014, 06:02. Показов 8938. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru