Russian Qt Forum
Июнь 16, 2024, 21:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Аналог LockBits, работа с битмапом  (Прочитано 17023 раз)
GPPsoft
Гость
« Ответ #15 : Декабрь 18, 2013, 08:34 »

А мне к примеру нужно поработать с областью (64,64,10,10) в битмапе с разверткой 1280x800. Вот код на шарпе дает мне указатель на x,y точки.
Напишите один раз такую функцию и пользуйтесь. Она будет очень простая.
Правильно мыслю?
Код:

QRect visibleRect = ....;

..............................

QImage currentRegionMap = getRegion(screen,visibleRect.x(),visibleRect.y(),visibleRect.width(),visibleRect.height());//Получаю область картинки...

int pixLen=currentRegionMap.bytesPerLine()/currentRegionMap.width();//Высчитываю длину пикселя

BYTE* a=currentRegionMap.bits();//Получаю указатель на "данные" картинки
BYTE* b=screenMap.scanLine(visibleRect.y())+(pixLen*visibleRect.x());//Тут получаю указатель на регион в другой картинке ...

Я до сих пор в ней смысла не вижу Улыбающийся

Для вас нарисовал рисунок. Мне нужно сравнить картинку с регионом другой картинки. Попиксельно сравнивать медленно, гораздо быстрее так.
« Последнее редактирование: Декабрь 18, 2013, 08:37 от GPPsoft » Записан
Bepec
Гость
« Ответ #16 : Декабрь 18, 2013, 08:44 »

Спасибо за картинку, порадовали. Вот только это получение региона, отдельной части картинки.
А ему необходим указатель на начало данных.

PS в принципе это почти одно и то же, но всё же разные вещи ^.^
Записан
GPPsoft
Гость
« Ответ #17 : Декабрь 18, 2013, 08:50 »

Спасибо за картинку, порадовали. Вот только это получение региона, отдельной части картинки.
А ему необходим указатель на начало данных.
PS в принципе это почти одно и то же, но всё же разные вещи ^.^
Я вас кажется тоже не понимаю Улыбающийся. Вроде понятно же.. Есть картинка 1 и есть картинка 2. Я хочу сравнить картинку 1 с регионом равным по размерам в картинке 2. Мне нужен указатель на начало данных в картинке 1 и указатеь на начало региона в картинке 2. Вот как получить указатель на начала региона в картинке 2? Я правильно мыслю...(смотреть код выше)?
Записан
GPPsoft
Гость
« Ответ #18 : Декабрь 18, 2013, 08:52 »

Вот только это получение региона, отдельной части картинки.
Посмотрите пост #1. В C# я так и делаю.. Лочится память кокраз региона картинки и я получаю указатель на регион. Если можно сделать так же как в C#, то я буду очень рад.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Декабрь 18, 2013, 10:42 »

Задача на 5 минут, неск дней обсуждаем  Улыбающийся
Код
C++ (Qt)
bool CompareParts( const QImage & img1, const QRect & R1, const QImage & img2, const QRect & R2 )
{
if (R1.width() != R2.width()) return false;
if (R1.height() != R2.height()) return false;
 
int pixSize = img1.depth() / 8;
if (!pixSize || pixSize != img2.depth() / 8)
 return CompareByPixels(img1, R1, img2, R2);
 
for (int y = 0; y < R1.height(); ++y) {
  const uchar * src1 = img1.scanLine(y + R1.top()) + pixSize * R1.left();
  const uchar * src2 = img2.scanLine(y + R2.top()) + pixSize * R2.left();
  if (memcmp(src1, src2, R1.width() * pixSize) != 0) return false;
}
return true;
}
Записан
GPPsoft
Гость
« Ответ #20 : Декабрь 18, 2013, 11:22 »

Задача на 5 минут, неск дней обсуждаем  Улыбающийся
Код
C++ (Qt)
bool CompareParts( const QImage & img1, const QRect & R1, const QImage & img2, const QRect & R2 )
{
if (R1.width() != R2.width()) return false;
if (R1.height() != R2.height()) return false;
 
int pixSize = img1.depth() / 8;
if (!pixSize || pixSize != img2.depth() / 8)
 return CompareByPixels(img1, R1, img2, R2);
 
for (int y = 0; y < R1.height(); ++y) {
  const uchar * src1 = img1.scanLine(y + R1.top()) + pixSize * R1.left();
  const uchar * src2 = img2.scanLine(y + R2.top()) + pixSize * R2.left();
  if (memcmp(src1, src2, R1.width() * pixSize) != 0) return false;
}
return true;
}
Спасибо конечно, но вы не знаете всей задачи которую я решаю. Ваш код бесполезен для меня.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Декабрь 18, 2013, 12:12 »

Спасибо конечно, но вы не знаете всей задачи которую я решаю. Ваш код бесполезен для меня.
Цитированием не злоупотрбляйте, незачем занимать тратить место если и так понятно на что Вы ответили.

Задачи Вашей я конечно не знаю - ну так Вам и карты в руки четко сформулировать вопрос. Если нужны "начала регионов", то их вычисления в приведенном коде есть. При этом однако нужно учитывать что "региона" никакого нет, а есть поле памяти где QImage хранит пиксели и Вы можете оперировать с нужным участком - но для каждой новой строки адрес придется вычислять. Это нормально, непонятно какие у Вас с этим трудности. Ну захотите - расскажете
Записан
GPPsoft
Гость
« Ответ #22 : Декабрь 18, 2013, 12:24 »

Цитировать
Ну захотите - расскажете

Мне нужно получить участок памяти который отвечает за определенный участок изображения. Проще говоря как мне осуществить такое?
Код
C#
BitmapData btmData= currentRegionMap.LockBits(new Rectangle(x, y, width, height), ImageLockMode.ReadOnly, currentRegionMap.PixelFormat);
byte* a = (byte*)btmData.Scan0.ToPointer();
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Декабрь 18, 2013, 12:37 »

Мне нужно получить участок памяти который отвечает за определенный участок изображения. Проще говоря как мне осуществить такое?
Чем раньше Вы перестанете ссылаться на "козырный С#" - тем лучше. Хорошо или плохо - но в таком-то языке вещи делаются так-то, это от нас не зависит. Примите это и не тормозите.

Возможно Вы хотели спросить "как получить НЕПРЕРЫВНЫЙ участок памяти?". Никак, (конечно за исключением "полных строк"). Можно только создать копию кусочка (QImage::copy), она будет непрерывна, но операция копирования затратна. Возможно Вы хотели что-то делать "одним куском" - так не выйдет, придется чуть-чуть повозиться со строками
Записан
GPPsoft
Гость
« Ответ #24 : Декабрь 18, 2013, 13:28 »

Как 3 строку закрасить в черный цвет? Или как изменить значение пикселя по указателю? Спасибо. Не заметил просто Улыбающийся Работает! Сейчас буду со строками эксперементировать.

Пробовал так:
Код:
    uchar * point= image.scanLine(2);

    for(int i=0;i<image.bytesPerLine();i++)
    {
        *point=0;
        point++;
    }
« Последнее редактирование: Декабрь 18, 2013, 13:31 от GPPsoft » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Декабрь 18, 2013, 13:34 »

Код:
    uchar * point= image.scanLine(2);

    for(int i=0;i<image.bytesPerLine();i++)
    {
        *point=0;
        point++;
    }
Не ошибка, но приятнее так
Код
C++ (Qt)
   memset(image.scanLine(2), 0, image.bytesPerLine());
 
Записан
GPPsoft
Гость
« Ответ #26 : Декабрь 18, 2013, 13:53 »

Цитировать
Не ошибка, но приятнее так

Спасибо. Как получить скриншот в 24битной развертке? По умолчанию возвращает в развертке 4 байта на пиксель. Нужно 3 байта на пиксель.

Код:
QPixmap MainWindow::getScreenshot()
{
    QScreen *screen = QGuiApplication::primaryScreen();
    return screen->grabWindow(QApplication::desktop()->winId(),0,0,-1,-1);
}
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #27 : Декабрь 18, 2013, 14:08 »

Спасибо. Как получить скриншот в 24битной развертке? По умолчанию возвращает в развертке 4 байта на пиксель. Нужно 3 байта на пиксель.

Преобразуй в QImage и дальше QImage::convertToFormat(). И начни читать документацию, там есть все ответы на твои вопросы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Декабрь 18, 2013, 14:29 »

Спасибо. Как получить скриншот в 24битной развертке? По умолчанию возвращает в развертке 4 байта на пиксель. Нужно 3 байта на пиксель.
Насколько я помню, 3 "нормальных" байт не получить, QImage::FormatRGB32 все равно хранит 4 байта на пыксель, просто альфа не используется. Реально все меньше 32 - дань истории, не связывайтесь с этим старьем
Записан
GPPsoft
Гость
« Ответ #29 : Декабрь 18, 2013, 14:39 »

Цитировать
Насколько я помню, 3 "нормальных" байт не получить, QImage::FormatRGB32 все равно хранит 4 байта на пыксель, просто альфа не используется. Реально все меньше 32 - дань истории, не связывайтесь с этим старьем

Мне бы как в C# Улыбающийся PixelFormat.Format24bppRgb. Просто ведь тогда быстрее проверять буду разницу. И меньше в памяти занимать будет.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 22.