65.9K
CodeProject 正在变化。 阅读更多。
Home

Adobe Photoshop文件加载器模板类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2002年1月23日

2分钟阅读

viewsIcon

100359

downloadIcon

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_COLLECTIONCHANNEL_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_POLICYLoadFromAbstraction() 加载通道数据。

CHANNEL_COLLECTION *
Load( const char * filename, const int nLoadChannelCountMax = 0 );

用法

通常需要访问 Adobe Photoshop 文件中的各个通道数据,因此此模板可以节省大量时间和精力。 

© . All rights reserved.