天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 149|回复: 0

[每日一码] Inserting RasterImage using image buffer

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    [每日一码] Inserting RasterImage using image buffer
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 07:55 , Processed in 0.139728 second(s), 29 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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