2016-03-14 6 views
0

Мое требование к проекту состоит в том, что я могу создать изображение шириной до 36000 пикселей (высота намного меньше).
(Изображение отображается с QGraphicsScene).Можно ли добавить один QImage к другому без использования растровой графики?

я столкнулся с ограничением: QPainter ограничивает его размер устройства для растровой живописи:

void QRasterPaintEnginePrivate::systemStateChanged() 
{ 
    deviceRectUnclipped = QRect(0, 0, 
      qMin(QT_RASTER_COORD_LIMIT, device->width()), 
      qMin(QT_RASTER_COORD_LIMIT, device->height())); 
    .... 
} 

// This limitations comes from qgrayraster.c. Any higher and 
// rasterization of shapes will produce incorrect results. 
const int QT_RASTER_COORD_LIMIT = 32767; 

(Моя попытка устранить ... Rendering a large QGraphicsScene on a QImage clips it off)

Итак ... Я думал, я могу создать 2 изображения затем добавить их? (Один в конце друг друга)

if(wOutput > 32767) 
{ 
    QImage image1 = QImage(32767, hOutput, QImage::Format_Mono); 
    image1.fill(QColor(Qt::white).rgb()); 
    QRectF source(0, 0, 32767, hOutput); 
    QRectF target(0, 0, 32767, hOutput); 
    QPainter painter; 
    painter.begin(&image1); 
    outputScene->render(&painter, target, source); 
    painter.end(); 

    QImage image2 = QImage(wOutput - 32767, hOutput, QImage::Format_Mono); 
    image2.fill(QColor(Qt::white).rgb()); 
    source = QRectF(32767, 0, wOutput - 32767, hOutput); 
    target = QRectF(0, 0, wOutput - 32767, hOutput);  
    painter.begin(&image2); 
    outputScene->render(&painter, target, source); 
    painter.end(); 

    // now create a combination, add image2 at the end of image1 
    QImage image = QImage(wOutput, hOutput, QImage::Format_Mono); 
    painter.begin(&image); 
    painter.drawImage(0, 0, image1); 
    painter.drawImage(32767, hOutput, image2); 
    painter.end(); 
} 
else 
{ 
    // just create the image 
} 

выглядит очень логично ... но выход не показывает image2. Очевидно ... Я использую ту же растровую картину ... с тем же ограничением!

Каким другим способом можно добавить изображение в конце другого? (примечание - мой «большой» размер - это «ширина», поэтому я даже не думаю, что могу использовать scanline для копирования пикселей быстрее)

+0

Почему вы не хотите использовать ScanLine, чтобы получить пиксельные данные и скопировать его ? – Fabio

+0

@Fabio - я мог бы, но как – Thalia

ответ

1

Вы можете использовать QImage::scanLine, чтобы получить данные о пикселях и скопировать их. Однако QImage::Format_Mono делают его немного более сложным, потому что вам необходимо рассмотреть выравнивание данных пикселей (с QImage::Format_Mono у вас есть 1 бит на пиксель, поэтому 8 пикселей в байте).

Предлагаю сгенерировать первое изображение, используя ширину, делящуюся на 8 (например, 32760), поэтому вы можете скопировать строку второго изображения без смещения бит.

Также таблица цветов должна быть одинаковой в двух исходных изображениях.

Вы можете сделать что-то вроде этого:

int w1 = 32760; 
QImage image1 = QImage(w1, hOutput, QImage::Format_Mono); 
//grab the first image.... 
//.... 
int w2 = wOutput - w1; 
QImage image2 = QImage(w2, hOutput, QImage::Format_Mono); 
//grab the second image.... 
//.... 

int bytesPerLine1 = w1/8; //is divisible by 8 
int bytesPerLine2 = ceil(float(w2)/8.0f); //should be right :) 
QImage image = QImage(wOutput, hOutput, QImage::Format_Mono); 
image.setColorTable(image1.colorTable()); 
for(int i = 0; i < hOutput; ++i) 
{ 
    uchar* dstSL = image.scanLine(i); 
    uchar* src1SL = image1.scanLine(i); 
    memcpy(dstSL, src1SL, bytesPerLine1); 
    uchar* src2SL = image2.scanLine(i); 
    memcpy(&dstSL[bytesPerLine1], src2SL, bytesPerLine2); 
} 

Я предлагаю также прочитать документацию Qimage: Pixel Manipulation и QImage::Format