找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 171|回复: 0

[每日一码] Inserting RasterImage using image buffer

[复制链接]

1

主题

0

回帖

33

积分

管理员

积分
33
发表于 2024-3-14 21:01:09 | 显示全部楼层 |阅读模式
  1. static void AdskInsertImage(void)
  2. {
  3.     // Image path to use for the RasterImageDef
  4.     AcString imagePath(ACRX采用T("C:\\Temp\\Test.png"));
  5.     // Load the image to get access to its image buffer
  6.     AcTcImage tc;
  7.     tc.Load(imagePath);
  8.     HBITMAP bmp=0;
  9.     tc.GetHBITMAP(RGB(0xff,0xff,0xff),bmp);
  10.     if (bmp == NULL)
  11.         return;
  12.     BITMAP 采用bmp={0};
  13.     GetObject(bmp,sizeof BITMAP,&采用bmp);
  14.     HDC hdcScr=GetDC(NULL);
  15.     HDC    hdcMem=CreateCompatibleDC(hdcScr);
  16.     SelectObject(hdcMem,bmp);
  17.     // Create an Atil::Image.
  18.     // The AcDbRasterImageDef::setImage requires it
  19.     Atil::ImagePixel initialImage;
  20.     initialImage.setToZero();
  21.     initialImage.type = Atil::DataModelAttributes::kRgba;
  22.     initialImage.value.rgba = 0xff000000;
  23.     Atil::Size size(采用bmp.bmWidth, 采用bmp.bmHeight);
  24.     const Atil::RgbModel *pDm = new Atil::RgbModel(
  25.         Atil::RgbModelAttributes::k4Channels,
  26.         Atil::DataModelAttributes::kBlueGreenRedAlpha);
  27.     Atil::Image *pAtilImage = new Atil::Image(
  28.                                      size, pDm, initialImage);
  29.     // Write the image data on to the Atil image
  30.     // using an Image Context
  31.     Atil::Offset upperLeft(0,0);
  32.     Atil::ImageContext *pImgContext
  33.         = pAtilImage->createContext(
  34.                                     Atil::ImageContext::kWrite,
  35.                                     size,
  36.                                     upperLeft
  37.                                     );
  38.     if (pImgContext != NULL)
  39.     {
  40.         for (int xf=0;xf<采用bmp.bmWidth;xf++)
  41.         {
  42.             for (int yf=0;yf<采用bmp.bmHeight;yf++)
  43.             {
  44.                 BYTE alpha=0x0;
  45.                 COLORREF pix=GetPixel(hdcMem,xf,yf);
  46.                 BYTE rr = (pix&0xff);
  47.                 BYTE gg = (pix>>8)&0xff;
  48.                 BYTE bb = (pix>>16)&0xff;
  49.                 // Alpha channel to account for transparency
  50.                 if ((rr!=0xff) || (gg!=0xff) || (bb!=0xff))
  51.                     alpha=0xff;
  52.                 Atil::RgbColor p;
  53.                 p.set(rr, gg, bb, alpha);
  54.                 pImgContext->put32(xf, yf, p);
  55.             }
  56.         }
  57.     }
  58.     pImgContext->flush();
  59.     delete pImgContext;
  60.     bool isImageValid = pAtilImage->isValid();
  61.     ASSERT(isImageValid);
  62.     // Create a RasterImageDef and set the image
  63.     // from the Atil image
  64.     AcDbRasterImageDef *pImageDef = new AcDbRasterImageDef();
  65.     Acad::ErrorStatus es = pImageDef->setImage(
  66.                                             pAtilImage, NULL);
  67.     // Insert the RasterImageDef and create a RasterImage
  68.     // using it
  69.     es = InsertImageInDwg(pImageDef);
  70.     if(es != Acad::eOk)
  71.     {
  72.         delete pImageDef;
  73.         return;
  74.     }
  75.     // Cleanup
  76.     DeleteDC(hdcMem);
  77.     ReleaseDC(NULL,hdcScr);
  78.     DeleteObject( bmp);
  79. }
  80. static Acad::ErrorStatus InsertImageInDwg(
  81.                                 AcDbRasterImageDef *pImageDef)
  82. {
  83.     Acad::ErrorStatus es;
  84.     if(! pImageDef->isLoaded())
  85.     {
  86.         es = pImageDef->load();
  87.         if(es != Acad::eOk)
  88.             return es;
  89.     }
  90.     AcApDocument *pActiveDoc = acDocManager->mdiActiveDocument();
  91.     AcDbDatabase *pDB = pActiveDoc->database();
  92.     // Get the image dictionary
  93.     // Create it if not available already
  94.     AcDbObjectId dictID
  95.                     = AcDbRasterImageDef::imageDictionary(pDB);
  96.     if(dictID == AcDbObjectId::kNull)
  97.     {
  98.         es = AcDbRasterImageDef::createImageDictionary(
  99.                                                   pDB, dictID);
  100.         if(es != Acad::eOk)
  101.             return es;
  102.     }
  103.     AcDbDictionary* pDict;
  104.     es = acdbOpenObject(pDict, dictID, AcDb::kForWrite);
  105.     if(es != Acad::eOk)
  106.             return es;
  107.     ACHAR *DICT采用NAME = ACRX采用T("ISM采用RASTER采用IMAGE采用DICT采用VIEW");
  108.     BOOL bExist = pDict->has(DICT采用NAME);
  109.     AcDbObjectId objID = AcDbObjectId::kNull;
  110.     if (!bExist)
  111.     {
  112.         es = pDict->setAt(DICT采用NAME, pImageDef, objID);
  113.         if(es != Acad::eOk)
  114.             return es;
  115.     }
  116.     else
  117.     {
  118.         pDict->getAt(DICT采用NAME,
  119.                     (AcDbObject*&)pImageDef,
  120.                     AcDb::kForWrite);
  121.         objID = pImageDef->objectId();
  122.     }
  123.     // close Dictionary and Definition.
  124.     pDict->close();
  125.     pImageDef->close();
  126.     // Create a raster image using the RasterImage Def
  127.     AcDbRasterImage* pImage = new AcDbRasterImage;
  128.     es = pImage->setImageDefId(objID);
  129.     if (es != Acad::eOk)
  130.     {
  131.         delete pImage;
  132.         return es;
  133.     }
  134.     // Add the raster image to the model space
  135.     AcDbBlockTable* pBlockTable;
  136.     AcDbBlockTableRecord* pBTRecord;
  137.     es = acdbCurDwg()->getBlockTable(pBlockTable,
  138.                                      AcDb::kForRead);
  139.     assert(es == Acad::eOk);
  140.     es = pBlockTable->getAt(ACDB采用MODEL采用SPACE,
  141.                             pBTRecord,
  142.                             AcDb::kForWrite);
  143.     assert(es == Acad::eOk);
  144.     es = pBTRecord->appendAcDbEntity(pImage);
  145.     assert(es == Acad::eOk);
  146.     pBTRecord->close();
  147.     pBlockTable->close();
  148.     AcDbObjectId entID = pImage->objectId();
  149.     // Set the transparency options
  150.     pImage->setDisplayOpt(    AcDbRasterImage::kTransparent,
  151.                             Adesk::kTrue);
  152.     pImage->setImageTransparency(true);
  153.     pImage->setDisplayOpt(AcDbRasterImage::kShow, Adesk::kTrue);
  154.     AcDbObjectPointer<AcDbRasterImageDefReactor>
  155.                                         rasterImageDefReactor;
  156.     rasterImageDefReactor.create();
  157.     es = rasterImageDefReactor->setOwnerId(pImage->objectId());
  158.     if (es == Acad::eOk)
  159.     {
  160.         AcDbObjectId defReactorId;
  161.         es = curDoc()->database()->addAcDbObject(
  162.                             defReactorId,
  163.                             rasterImageDefReactor.object());
  164.         if (es == Acad::eOk)
  165.         {
  166.             pImage->setReactorId(defReactorId);
  167.             AcDbObjectPointer<AcDbRasterImageDef> rasterImagedef
  168.                       (pImage->imageDefId(), AcDb::kForWrite);
  169.             if (rasterImagedef.openStatus() == Acad::eOk)
  170.             {
  171.                 rasterImagedef->addPersistentReactor
  172.                                                (defReactorId);
  173.             }
  174.         }
  175.     }
  176.     pImageDef->close();
  177.     pImage->close();
  178. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-29 20:29 , Processed in 0.151810 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表