21/03/2015
Создание прозрачного растра при помощи ATIL
Вот пример кода, который реализует собственный фильтр растра ATIL для создания прозрачного растра. Реализация устанавливает Альфа-канал для пикселей красного цвета в растре. Вы можете изменить код для использования любого другого значения RGB цвета. Полностью пример проекта можно скачать отсюда: TransparentSnapShotUsingATILЭтот пример использует метод getSnapShot для сколки выбранных примитивов. Чтобы попробовать его перестройте проект и загрузите его в AutoCAD 2015. Откройте чертеж и запустите команду GenImg и выберите примитив. Красный фон будет намеренно установлен для AcGsDevice при генерации образа экрана. Это потому что мы используем красный цвет в качестве прозрачного в фильтре. Прозрачный растр будет сохранен в файл “D:\Temp\Test_Arx.png”.
Вот соответствующий код:
Код - C++: [Выделить]
- // MyRgbaTransparency.h
- #ifndef MYRGBATRANSPARENCY_H
- #define MYRGBATRANSPARENCY_H
- class MyRgbaTransparency
- : public Atil::ImageFilter
- {
- public :
- MyRgbaTransparency (
- Atil::RowProviderInterface* pInput,
- int nKeyColors,
- Atil::RgbColor* paKeyColors);
- virtual ~MyRgbaTransparency ();
- virtual int rowsRemaining ();
- virtual void getNextRow (Atil::DataBuffer &oneRow);
- virtual void convertColor (Atil::ImagePixel& color) const ;
- private :
- enum By { kQuad, kTreble, kNon };
- By mBy;
- int mnRows;
- int mnColumns;
- int mnKeyColors;
- int mnRowsRemaining;
- Atil::RgbColor* mpKeyColors;
- };
- #endif
- // MyRgbaTransparency.cpp
- #include "stdafx.h"
- #include "MyRgbaTransparency.h"
- MyRgbaTransparency::MyRgbaTransparency
- (Atil::RowProviderInterface* pInput,
- int nKeyColors,
- Atil::RgbColor* paKeyColors )
- {
- connectInput( pInput );
- Atil::Size size(input(0)->size());
- mnColumns = size.width;;
- mnRows = size.height;
- mnRowsRemaining = size.height;
- mnKeyColors = nKeyColors;
- switch (input(0)->dataModel().dataModelType())
- {
- case Atil::DataModelAttributes::DataModelType::kRgbModel:
- {
- mBy = kTreble;
- init( size );
- break ;
- }
- default :
- {
- mBy = kQuad;
- init( size );
- break ;
- }
- }
- }
- MyRgbaTransparency::~MyRgbaTransparency ()
- {
- }
- int MyRgbaTransparency::rowsRemaining ()
- {
- return mnRowsRemaining;
- }
- void MyRgbaTransparency::getNextRow (Atil::DataBuffer &oneRow)
- {
- input(0)->getNextRow(oneRow);
- if ( mnRowsRemaining > 0 )
- {
- if ( mBy == kTreble )
- {
- Atil::RgbColor *pColor = (Atil::RgbColor*) oneRow.dataPtr();
- for (int i=0; i<mnColumns; ++i)
- {
- if ( pColor[i].rgba.red == 255 &&
- pColor[i].rgba.blue == 0 &&
- pColor[i].rgba.green == 0)
- { // Устанавливаем Альфа в 0 только для красного цвета
- pColor[i].rgba.alpha = 0;
- }
- }
- }
- --mnRowsRemaining;
- }
- }
- void MyRgbaTransparency::convertColor
- (Atil::ImagePixel& color) const
- {
- ImageFilter::convertColor(color);
- switch ( color.type )
- {
- case Atil::DataModelAttributes::PixelType::kRgba:
- {
- Atil::RgbColor rgb( color.value.rgba );
- if ( rgb.rgba.red == 255
- && rgb.rgba.blue == 0
- && rgb.rgba.green == 0)
- { // Устанавливаем Альфа в 0 только для красного цвета
- rgb.packed = rgb.packed;
- rgb.rgba.alpha = 0;
- color.value.rgba = rgb;
- }
- break ;
- }
- }
- }
- static bool CreateAtilImage(AcGsView *pView,
- int width, int height,
- int colorDepth, int paletteSize,
- ACHAR *pFileName)
- {
- // Используем фильтр
- Atil::RgbModel rgbModel(Atil::RgbModelAttributes::k4Channels,
- Atil::DataModelAttributes::kRedGreenBlueAlpha);
- Atil::ImagePixel initialColor(Atil::DataModelAttributes::PixelType::kRgba);
- initialColor.setToZero();
- initialColor.type = Atil::DataModelAttributes::kRgba;
- initialColor.value.rgba = 0xff000000;
- Atil::Image imgSource(Atil::Size(width, height), &rgbModel, initialColor);
- // Получаем снимок GsView
- pView->getSnapShot(&imgSource, screenRect.m_min);
- Atil::RowProviderInterface *pPipe = imgSource.read(
- imgSource.size(), Atil::Offset(0,0), Atil::kBottomUpLeftRight);
- if (pPipe != NULL)
- {
- Atil::RgbColor aColors[1];
- COLORREF crBkg = RGB(255, 0, 0);
- aColors[0] = Atil::RgbColor(
- GetRValue(crBkg),
- GetGValue(crBkg & 0xffff),
- GetBValue(crBkg), 0);
- pPipe = new MyRgbaTransparency( pPipe, 1, aColors);
- if (pPipe != NULL && pPipe->isValid())
- {
- TCHAR drive[_MAX_DRIVE];
- TCHAR dir[_MAX_DIR];
- TCHAR fname[_MAX_FNAME];
- TCHAR ext[_MAX_EXT];
- // Находим расширение
- _tsplitpath_s( pFileName, drive, dir, fname, ext);
- Atil::ImageFormatCodec *pCodec = NULL;
- if (CString(ext) == _T(".png" ))
- pCodec = new PngFormatCodec();
- if (pCodec != NULL)
- {
- // Оно совместимо
- if (Atil::FileWriteDescriptor::isCompatibleFormatCodec(
- pCodec, &(pPipe->dataModel()),
- pPipe->size()))
- {
- // Создаем новый выходной файл
- Atil::FileWriteDescriptor fileWriter(pCodec);
- Atil::FileSpecifier fs(
- Atil::StringBuffer((lstrlen(pFileName)+1)
- * sizeof (TCHAR),
- (const Atil::Byte *)pFileName,
- Atil::StringBuffer::kUTF_16),
- Atil::FileSpecifier::kFilePath);
- // Если файл уже существует
- // лучше его предварительно удалить, в противном случае setFileSpecifier
- // закончится с ошибкой
- _tremove(pFileName);
- if (fileWriter.setFileSpecifier(fs))
- {
- fileWriter.createImageFrame(
- pPipe->dataModel(),
- pPipe->size());
- // Получаем свойство сжатия и меняем его на нужное нам
- Atil::FormatCodecPropertyInterface *pProp = fileWriter.getProperty(
- Atil::FormatCodecPropertyInterface::kCompression);
- if (pProp != NULL)
- {
- if (CString(ext) == _T(".png" ))
- {
- PngCompression *pComp = dynamic_cast <PngCompression*>(pProp);
- if (pComp != NULL)
- {
- pComp->selectCompression(PngCompressionType::kHigh);
- fileWriter.setProperty(pComp);
- }
- }
- // чистим
- delete pProp;
- pProp = NULL;
- }
- }
- Atil::FormatCodecPropertySetIterator* pPropsIter = fileWriter.newPropertySetIterator();
- if (pPropsIter)
- {
- for (pPropsIter->start(); !pPropsIter->endOfList(); pPropsIter->step())
- {
- Atil::FormatCodecPropertyInterface* pProp = pPropsIter->openProperty();
- if (pProp->isRequired())
- {
- fileWriter.setProperty(pProp);
- }
- pPropsIter->closeProperty();
- }
- delete pPropsIter;
- }
- Atil::FormatCodecPropertyInterface *pTransparencyProp = fileWriter.getProperty(
- Atil::FormatCodecPropertyInterface::kTransparency);
- if (pTransparencyProp)
- {
- fileWriter.setProperty(pTransparencyProp);
- }
- // Готовы записывать файл
- fileWriter.writeImageFrame(pPipe);
- done = true ;
- }
- }
- delete pCodec;
- }
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2015/03/creating-transparent-image-using-atil.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=2579
Опубликовано 21.03.2015