Adobe Photoshop文件加载器模板类






4.50/5 (2投票s)
2002年1月23日
2分钟阅读

100359

690
一个模板类,用于简化加载Adobe Photoshop文件的过程。
引言
这里提供了一种快速加载颜色、Alpha 和选区通道数据的方法,用于扁平化*的 Adobe Photoshop 图像文件。
* 如果 Photoshop 的保存文件偏好设置为最大程度地与旧版本兼容,则文件将包含预合成版本的图像以及图层。)
使用示例
typedef BPT::TPSDFileLoader<ExampleSurface> loader_type; typedef loader_type::channel_collection_type::iterator channel_iterator; loader_type psdLoader; loader_type::channel_collection_type * pChannels = psdLoader.Load( pszFilename ); if ( pChannels ){ int channelCount = pChannels->size(); std::cout << "There are " << channelCount << "channels.\n" << std::endl; int channel = 1; for ( channel_iterator it = pChannels->begin(); it != pChannels->end(); it++ ) { ExampleSurface * pSurface = *it; if ( 1 == channel ) { std::cout << "Red "; } else if ( 2 == channel ) { std:cout << "Green "; } else if ( 3 == channel ) { std:cout << "Blue "; } else { std:cout << "Alpha "; } std::cout << "Channel " << channel << "of " << channelCount; std::cout << " Width " << pSurface->Width(); std::cout << " Height " << pSurface->Height(); std::cout << endl; ++channel; } psdLoader.Unload( pChannels ); }
TPSDFileLoader 模板参数
template< class CHANNEL_SURFACE ,class CHANNEL_COLLECTION = std::list<CHANNEL_SURFACE *> ,class INPUT_POLICY = TFileIO<> ,class SIZE_COLLECTION = std::vector<int> > class TPSDFileLoader {
默认模板参数对于 Win32 环境来说是合理的默认值。但是,如果您想将代码移植到稍微不同的平台,或者您有特定的存储需求,则可以使用您的类型覆盖默认值。如果您对默认值满意,则您*必须*指定 CHANNEL_SURFACE
类型。
CHANNEL_SURFACE
加载器仅引用四种方法(Create()
、Width()
、Height()
和 Iterator()
)和一种公开类型(pixel_iterator
)来自 CHANNEL_SURFACE
类型。 接口相对较小,因此编写大多数位图表示形式的适配器类应该很容易。 这里有一个符合加载器 CHANNEL_SURFACE
使用的示例表面。
struct ExampleSurface { typedef BYTE pixel_type; typedef pixel_type * pixel_iterator; SIZE m_Size; pixel_iterator m_Storage; int Width() { return m_Size.cx; } int Height() { return m_Size.cy; } pixel_iterator Iterator( const int x, const int y ) { if ( !m_Storage ) return 0; return m_Storage + (y * m_Size.cx) + x; } void Destroy() { if ( m_Storage ) { delete [] m_Storage; m_Storage = 0; } m_Size.cx = m_Size.cy = 0; } bool Create( const int width, const int height ) { Destroy(); m_Storage = new pixel_type [ width * height ]; m_Size.cx = width; m_Size.cy = height; return (0 != m_Storage); } ~ExampleSurface() { Destroy(); } ExampleSurface() : m_Storage(0) { m_Size.cx = m_Size.cy = 0; } };
CHANNEL_COLLECTION
CHANNEL_COLLECTION
是将用于返回通道数据的集合类型。
class CHANNEL_COLLECTION = std::list<CHANNEL_SURFACE *>
INPUT_POLICY
此策略类用于提供低级输入功能;默认类只是 fopen/fclose 和相关基本读取方法的包装器。它具有用于读取以特定字节序存储的 16 位和 32 位值的方法。 除了提供必要的读取接口外,它还隐藏了将数据块读入内存时的内存分配/释放细节。
struct ExampleInputPolicy { bool Open( const char * filename, const char * access ); void Close(); void Seek( const int pos, const int mode ); int Read_Byte(); int Read_m16(); int Read_m32(); BYTE * LoadData( const int nBytes ); void UnloadData( BYTE * ptr ); };
SIZE_COLLECTION
内部地,每个通道的大小都会被临时缓存,以简化加载器实现。
class SIZECOLLECTION = std::vector<int>
STL
如果您想消除对 STL 的依赖,可以通过为 SIZE_COLLECTION
和 CHANNEL_COLLECTION
指定不同的集合类型来做到这一点。
包含
如果您计划使用默认实现,则需要包含 list、vector 头文件。
#include <list> #include <vector> #include "psd_load_src.h"
公共方法
Unload()
销毁返回的通道集合。
void Unload( CHANNEL_COLLECTION * pLoadedData );
LoadFromAbstraction()
是低级公共方法,用于从传递的 IO
策略对象读取。
template< class INPUT > CHANNEL_COLLECTION * LoadFromAbstraction( INPUT & input, const int nLoadChannelCountMax = 0 );
Load()
-- 接受一个以空字符结尾的字符串,并使用 INPUT_POLICY
和 LoadFromAbstraction()
加载通道数据。
CHANNEL_COLLECTION * Load( const char * filename, const int nLoadChannelCountMax = 0 );
用法
通常需要访问 Adobe Photoshop 文件中的各个通道数据,因此此模板可以节省大量时间和精力。