Проблема следующая при отрисовки больших изображений требуется большой объем ОЗУ, есть ли какой-нибудь пример по делению области на части, отрисовки и сохранению в файл? Для отрисовки использую mapPaintToXImage с указанием необходимых параметров изображения, далее массив перевожу в QImage. У QImage тоже есть ограничение на ширину и высоту формируемого изображение(MAX_INT). Код для отрисовки использую такой
Код |
---|
void SaveAsPicDialog::SaveMap(int cx, int cy, int cw, int ch)
{
if (!MapHandle)
return;
// Область отрисовки карты
RECT rectDraw;
rectDraw.left = cx;
rectDraw.top = cy;
rectDraw.right = cx + cw;
rectDraw.bottom = cy + ch;
if (BitMap)
{
memset(BitMap, 0x0, BitMapSize);
XIMAGEDESC xImageDesc;
xImageDesc.Point = BitMap; // Адрес начала области пикселов
xImageDesc.Width = cw; // Ширина строки в пикселах
xImageDesc.Height = ch; // Число строк
xImageDesc.Depth = (cbBits->currentIndex()+1)*8; // Размер элемента в битах (8,16,24,32), задаются из QCOmboBox
xImageDesc.CellSize = xImageDesc.Depth/8; // Размер элемента(пиксела) в байтах
xImageDesc.RowSize = cw * xImageDesc.CellSize; // Ширина строки в байтах
// Отобразим фрагмент карты на экран
if (mapPaintToXImage(MapHandle, &xImageDesc, 0, 0, &rectDraw))
//if (mapPaintByFrameToXImage(MapHandle, &xImageDesc, &Frame, cw, ch, 1))
{
// в зависимости от глубины цвета карты выставляем формат картинки
QImage::Format format;
switch (xImageDesc.Depth)
{
case 8: format = QImage::Format_Indexed8; break;
case 16: format = QImage::Format_RGB16; break;
case 24: format = QImage::Format_RGB666; break;
case 32: format = QImage::Format_RGB32; break;
default: format = QImage::Format_Invalid; break;
}
QImage image((uchar *)BitMap, cw, ch, format);
image.save(pathtofile);
}
}
} |