bool ImageHandler::getSessionItemImage(SessionItem* pItem, QBuffer& buffer, const QString& format, int band, int* pBbox) { if (format.isEmpty()) { return false; } bool success = true; QImage image; Layer* pLayer = dynamic_cast<Layer*>(pItem); View* pView = dynamic_cast<View*>(pItem); if (pLayer != NULL) { SpatialDataView* pSDView = dynamic_cast<SpatialDataView*>(pLayer->getView()); if (pSDView != NULL) { UndoLock ulock(pSDView); DimensionDescriptor cur; DisplayMode mode; RasterLayer* pRasterLayer = dynamic_cast<RasterLayer*>(pLayer); if (band >= 0 && pRasterLayer != NULL) { RasterElement* pRaster = pRasterLayer->getDisplayedRasterElement(GRAY); DimensionDescriptor bandDesc = static_cast<RasterDataDescriptor*>(pRaster->getDataDescriptor())->getActiveBand(band); cur = pRasterLayer->getDisplayedBand(GRAY); mode = pRasterLayer->getDisplayMode(); pRasterLayer->setDisplayedBand(GRAY, bandDesc); pRasterLayer->setDisplayMode(GRAYSCALE_MODE); } int bbox[4] = {0, 0, 0, 0}; ColorType transparent(255, 255, 254); success = pSDView->getLayerImage(pLayer, image, transparent, bbox); if (pBbox != NULL) { memcpy(pBbox, bbox, sizeof(bbox)); } QImage alphaChannel(image.size(), QImage::Format_Indexed8); if (image.hasAlphaChannel()) { alphaChannel = image.alphaChannel(); } else { alphaChannel.fill(0xff); } QRgb transColor = COLORTYPE_TO_QCOLOR(transparent).rgb(); for (int y = 0; y < image.height(); y++) { for (int x = 0; x < image.width(); x++) { if (image.pixel(x, y) == transColor) { alphaChannel.setPixel(x, y, 0x00); } } } image.setAlphaChannel(alphaChannel); if (mode.isValid()) { pRasterLayer->setDisplayedBand(GRAY, cur); pRasterLayer->setDisplayMode(mode); } } } else if (pView != NULL) { success = pView->getCurrentImage(image); } else { success = false; } if (success) { buffer.open(QIODevice::WriteOnly); QImageWriter writer(&buffer, format.toAscii()); success = writer.write(image); } return success; }