22/01/2014
Вставка растрового изображения с использованием буфера изображения
Можно использовать метод AcDbRasterImageDef::setImage в случае если вы не хотите указывать путь к файлу растрового изображения при вставке изображения. Это можно считать еще одним подходм для выполнения того, что объясняется в этой статье. Методу AcDbRasterImageDef::setImage требуется указатель на ATIL изображение. В этом примере кода буфер изображения читается из растрового файла и используется для создания ATIL изображения. Указатель на ATIL изображение используется методом AcDbRasterImageDef::setImage для создания определения растрового изображения. Чтобы создать arx-файл на основе этого примера необходимо включить заголовочные файлы и библиотеки из каталога ObjectARX SDK с именем "\utils\Atil".
Код - C++: [Выделить]
- static void AdskInsertImage(void)
- {
- // Путь к файлу изображения для создания RasterImageDef
- AcString imagePath(ACRX_T("C:\\Temp\\Test.png"));
- // Загружаем изображение для получения доступа к буферу изображения
- AcTcImage tc;
- tc.Load(imagePath);
- HBITMAP bmp=0;
- tc.GetHBITMAP(RGB(0xff,0xff,0xff),bmp);
- if (bmp == NULL)
- return;
- BITMAP _bmp = {0};
- GetObject(bmp,sizeof BITMAP,&_bmp);
- HDC hdcScr = GetDC(NULL);
- HDC hdcMem = CreateCompatibleDC(hdcScr);
- SelectObject(hdcMem,bmp);
- // Создаем Atil::Image.
- // Его требует метод AcDbRasterImageDef::setImage
- Atil::ImagePixel initialImage;
- initialImage.setToZero();
- initialImage.type = Atil::DataModelAttributes::kRgba;
- initialImage.value.rgba = 0xff000000;
- Atil::Size size(_bmp.bmWidth, _bmp.bmHeight);
- const Atil::RgbModel *pDm = new Atil::RgbModel(
- Atil::RgbModelAttributes::k4Channels,
- Atil::DataModelAttributes::kBlueGreenRedAlpha);
- Atil::Image *pAtilImage = new Atil::Image(
- size, pDm, initialImage);
- // Записываем данные изображения в Atil изображение
- // Используем Image Context
- Atil::Offset upperLeft(0,0);
- Atil::ImageContext *pImgContext
- = pAtilImage->createContext(
- Atil::ImageContext::kWrite,
- size,
- upperLeft
- );
- if (pImgContext != NULL)
- {
- for (int xf=0;xf<_bmp.bmWidth;xf++)
- {
- for (int yf=0;yf<_bmp.bmHeight;yf++)
- {
- BYTE alpha=0x0;
- COLORREF pix=GetPixel(hdcMem,xf,yf);
- BYTE rr = (pix & 0xff);
- BYTE gg = (pix>>8) & 0xff;
- BYTE bb = (pix>>16) & 0xff;
- // Альфа-канал для вычисления прозрачности
- if ((rr != 0xff) || (gg != 0xff) || (bb != 0xff))
- alpha = 0xff;
- Atil::RgbColor p;
- p.set(rr, gg, bb, alpha);
- pImgContext->put32(xf, yf, p);
- }
- }
- }
- pImgContext->flush();
- delete pImgContext;
- bool isImageValid = pAtilImage->isValid();
- ASSERT(isImageValid);
- // Создаем RasterImageDef и устанавливаем изображение на основе
- // Atil изображения
- AcDbRasterImageDef *pImageDef = new AcDbRasterImageDef();
- Acad::ErrorStatus es = pImageDef->setImage(
- pAtilImage, NULL);
- // Вставляем RasterImageDef и создаем RasterImage
- // на его основе
- es = InsertImageInDwg(pImageDef);
- if(es != Acad::eOk)
- {
- delete pImageDef;
- return;
- }
- // Очищаем мусор
- DeleteDC(hdcMem);
- ReleaseDC(NULL,hdcScr);
- DeleteObject( bmp);
- }
- static Acad::ErrorStatus InsertImageInDwg(
- AcDbRasterImageDef *pImageDef)
- {
- Acad::ErrorStatus es;
- if(! pImageDef->isLoaded())
- {
- es = pImageDef->load();
- if(es != Acad::eOk)
- return es;
- }
- AcApDocument *pActiveDoc = acDocManager->mdiActiveDocument();
- AcDbDatabase *pDB = pActiveDoc->database();
- // Получаем словарь растров
- // или создаем его если его еще нет
- AcDbObjectId dictID
- = AcDbRasterImageDef::imageDictionary(pDB);
- if(dictID == AcDbObjectId::kNull)
- {
- es = AcDbRasterImageDef::createImageDictionary(
- pDB, dictID);
- if(es != Acad::eOk)
- return es;
- }
- AcDbDictionary* pDict;
- es = acdbOpenObject(pDict, dictID, AcDb::kForWrite);
- if(es != Acad::eOk)
- return es;
- ACHAR *DICT_NAME = ACRX_T("ISM_RASTER_IMAGE_DICT_VIEW");
- BOOL bExist = pDict->has(DICT_NAME);
- AcDbObjectId objID = AcDbObjectId::kNull;
- if (!bExist)
- {
- es = pDict->setAt(DICT_NAME, pImageDef, objID);
- if(es != Acad::eOk)
- return es;
- }
- else
- {
- pDict->getAt(DICT_NAME,
- (AcDbObject*&)pImageDef,
- AcDb::kForWrite);
- objID = pImageDef->objectId();
- }
- // Закрываем словарь и RasterImageDef.
- pDict->close();
- pImageDef->close();
- // Создаем RasterImage на основе RasterImageDef
- AcDbRasterImage* pImage = new AcDbRasterImage;
- es = pImage->setImageDefId(objID);
- if (es != Acad::eOk)
- {
- delete pImage;
- return es;
- }
- // Добавляем растр к пространству Модели
- AcDbBlockTable* pBlockTable;
- AcDbBlockTableRecord* pBTRecord;
- es = acdbCurDwg()->getBlockTable(pBlockTable,
- AcDb::kForRead);
- assert(es == Acad::eOk);
- es = pBlockTable->getAt(ACDB_MODEL_SPACE,
- pBTRecord,
- AcDb::kForWrite);
- assert(es == Acad::eOk);
- es = pBTRecord->appendAcDbEntity(pImage);
- assert(es == Acad::eOk);
- pBTRecord->close();
- pBlockTable->close();
- AcDbObjectId entID = pImage->objectId();
- // Устанавливаем свойство прозрачности
- pImage->setDisplayOpt( AcDbRasterImage::kTransparent,
- Adesk::kTrue);
- pImage->setImageTransparency(true);
- pImage->setDisplayOpt(AcDbRasterImage::kShow, Adesk::kTrue);
- AcDbObjectPointer<AcDbRasterImageDefReactor>
- rasterImageDefReactor;
- rasterImageDefReactor.create();
- es = rasterImageDefReactor->setOwnerId(pImage->objectId());
- if (es == Acad::eOk)
- {
- AcDbObjectId defReactorId;
- es = curDoc()->database()->addAcDbObject(
- defReactorId,
- rasterImageDefReactor.object());
- if (es == Acad::eOk)
- {
- pImage->setReactorId(defReactorId);
- AcDbObjectPointer<AcDbRasterImageDef> rasterImagedef
- (pImage->imageDefId(), AcDb::kForWrite);
- if (rasterImagedef.openStatus() == Acad::eOk)
- {
- rasterImagedef->addPersistentReactor
- (defReactorId);
- }
- }
- }
- pImageDef->close();
- pImage->close();
- }
Источник: http://adndevblog.typepad.com/autocad/2013/11/inserting-rasterimage-using-image-buffer.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=474
Опубликовано 22.01.2014