Преобразование QImage возвращает значение null

У меня есть изображение, и я пытаюсь преобразовать выбранную часть изображения с помощью метода QImage::transformed(const QTransform &matrix, Qt::TransformationMode mode). Но этот метод возвращает нулевое изображение. Также Qt написал в стандартный вывод:

«Qimage: не хватает памяти, возвращается нулевое изображение».

    QImage img;
    img.load("D:\\3.png");

QPolygonF polygonIn;
polygonIn  << QPointF(73, 63)
    << QPointF(362, 22)
    << QPointF(517, 325)
    << QPointF(1, 210);

QPolygonF polygonOut;
polygonOut  << QPointF(45, 39)
    << QPointF(228, 13)
    << QPointF(228, 198)
    << QPointF(180, 198);

    QTransform transform;
auto isOk = QTransform::quadToQuad(polygonIn, polygonOut, transform);
if(!isOk)
    throw std::runtime_error("Transformation impossible with such parameters.");

auto result = img.transformed(transform, Qt::TransformationMode::SmoothTransformation);

Я пытался отлаживать источники QImage. В строке 6633 файла qimage.cpp

QImage dImage(wd, hd, target_format);
QIMAGE_SANITYCHECK_MEMORY(dImage);

значения wd и hd огромны.

Может кто знает как мне решить эту проблему. Кстати, я использую qt 4.8.4.


person yaroslav    schedule 10.12.2013    source источник
comment
Что такое ширина и высота изображения? Насколько я знаю, если они больше ~ 32000 пикселей, может возникнуть проблема с загрузкой такого изображения.   -  person vahancho    schedule 11.12.2013
comment
Мое исходное изображение — s29.postimg.org/k45fwbmsn/Untitled.png, и я хочу преобразовать его в желтый многоугольник s9.postimg.org/3rcfnjej3/Untitled_Transform.png. На самом деле это угловые координаты.   -  person yaroslav    schedule 11.12.2013
comment
Ваши полигоны определенно неверны и производят ненормальное преобразование с коэффициентом масштабирования ~ 1e + 6. Вот почему вы получаете нулевое изображение.   -  person vahancho    schedule 11.12.2013


Ответы (1)


QImage работает нормально. Проблема в вашем преобразовании. Попробуйте следующий код для проверки:

qDebug() << transform.map(QRectF(0, 0, img.width(), img.height())).boundingRect();

Возвращает QRectF(-2.21401e+08,-1.9792e+08 2.21401e+08x1.97921e+08), если изображение 100x100. Очевидно, что такое большое изображение не может поместиться в памяти. Вам нужно исправить ваше преобразование, чтобы оно масштабировало ваше изображение до разумного размера. Я не знаю, откуда вы взяли эти магические числа, но попробуйте получить новые.

Также img = img.scaled(img.width(), img.height()); видимо не влияет (какой смысл масштабировать изображение до размера, который у него уже есть?). Код, связанный с painter, кажется неполным, но, вероятно, это проблема копирования и вставки.

person Pavel Strakhov    schedule 10.12.2013
comment
Спасибо за ответ. Мое входное изображение — s29.postimg.org/k45fwbmsn/Untitled.png, и я хочу чтобы преобразовать его в желтый многоугольник s9.postimg.org/3rcfnjej3/Untitled_Transform.png точки на самом деле являются угловыми координатами. Существует ли обходной путь для уменьшения размера преобразованного изображения? - person yaroslav; 11.12.2013
comment
Трансформация проходит ужасно — см. это изображение: i.stack.imgur.com/ipLM7.png (создано путем ручного преобразования изображения). Кажется, что преобразование для этих полигонов слишком кривое. Единственное, что вы можете сделать, это выбрать разные полигоны. - person Pavel Strakhov; 12.12.2013