У меня есть изображение, и я хочу разделить это изображение на n частей. Так что мне интересно, как я могу сделать это с QImage? Или есть лучший (с точки зрения производительности) класс Qt для этой задачи?
Например, представьте, что у меня есть изображение, состоящее из 1920×1080 пикселей, и я хочу разделить его на 100 частей, что означает, что каждый фрагмент будет состоять из 192×108 пикселей. Обратите внимание, что я не хочу создавать ту же часть, масштабированную до 192×108. Каждая часть — это отдельная часть основной картины.
Я приложил изображение, чтобы сделать мой вопрос понятнее.
Это изображение состоит из 1920×1080 пикселей, а каждая часть с сеткой состоит из 192×108 пикселей, я хочу рассматривать каждый из них как объект QImage без фактического деления его на 100 частей.
Есть ли способ сделать это с QImage? Производительность здесь важна, потому что я буду анализировать каждый кусок, и обычно их будет более 1000.
Спасибо за помощь!
РЕДАКТИРОВАТЬ: Оба метода работают отлично, однако метод alexisdm немного сложнее, более низкий уровень, но Быстрее. Метод jmk проще в использовании, но он медленнее.
Спасибо за оба ответа.
Вы можете создать QImage
без копирования каких-либо данных с использованием того же шага (байтов на строку) и формата, что и у исходного изображения, и передачи буфера необработанных данных со смещением, соответствующим желаемой начальной позиции, одному из конструкторов QImage
:
QImage createSubImage(QImage* image, const QRect & rect) {
size_t offset = rect.x() * image->depth() / 8
+ rect.y() * image->bytesPerLine();
return QImage(image->bits() + offset, rect.width(), rect.height(),
image->bytesPerLine(), image->format());
}
Исходное изображение должно существовать до тех пор, пока суб QImage
существует.
Но это может не сработать, если анализирующий код пытается напрямую получить доступ к необработанным данным изображения, не используя QImage::bytesPerLine()
, QImage::scanLine()
или же QImage::pixel()
,
Вы можете сделать это, создав новый QImage
объекты нужных размеров, затем рисуя в них соответствующие фрагменты исходного изображения. Для этого создайте QPainter
из пустого целевого изображения, и используйте drawImage()
метод для копирования определенного под прямоугольника.
Однако, если производительность важна, вы можете посмотреть на способы избежать ненужные копии вашего исходного изображения. Например, если вашему алгоритму нужно только смотреть на фрагмент изображения размером 192×108 за один раз, может ли он просто ограничить свой анализ конкретным под прямоугольником исходного изображения?
Если вы можете реструктурировать свой код таким образом, вы можете полностью избежать создания дополнительных изображений.
Вы можете использовать встроенную функцию QImage QImage::copy(const QRect &part)
это создает образ.