青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

c++初學(xué)者

專注技術(shù)開發(fā)

[轉(zhuǎn)]PSD格式文件的讀取

 PhotoShop,我想沒有人會(huì)不知道吧。如今最新的版本是6.0,其圖象文件*.PSD和5.5相比變化并不太大。以下我就介紹*.PSD文件的讀取方法,并提供完整讀取函數(shù)。其中:m_Rect為目標(biāo)區(qū)域,m_lpDDS7為目標(biāo)DirectDraw表面,m_pbAlphaMask為目標(biāo)Aplha通告指針。Read16函數(shù)為從指定文件當(dāng)前位置讀取一個(gè)WORD,Read32函數(shù)為從指定文件當(dāng)前位置讀取一個(gè)DWORD。MAX_PSD_CHANNELS為24。以下就是*.PSD文件的讀取方法,有興趣的朋友可以繼續(xù)深入研究,到時(shí)可別忘了發(fā)我一份。

  HRESULT LoadPSD( LPSTR strFilename ) // 讀取PSD文件
  {
    DWORD dwWidth, dwHeight;
// 寬高
    long lSurfWidth = m_Rect.right - m_Rect.left;
    long lSurfHeight = m_Rect.bottom - m_Rect.top;
    WORD CompressionType;
// 壓縮類型
    HDC hDC;
    FILE *fpPSD;
    WORD ChannelCount;
// 通道數(shù)

    // 打開PSD文件
    if ( ( fpPSD = fopen ( strFilename, "rb" ) ) == NULL ) {
      return E_FAIL;
    }

    // 頭四個(gè)字節(jié)為"8BPS"
    char signature[5];
    signature[0] = fgetc( fpPSD );
    signature[1] = fgetc( fpPSD );
    signature[2] = fgetc( fpPSD );
    signature[3] = fgetc( fpPSD );
    signature[4] = '\0';
    if ( strcmp( signature,"8BPS" ) != 0 ) {
      return E_FAIL;
    }

    // 版本必須為1
    if ( Read16( fpPSD ) != 1 ) {
      return E_FAIL;
    }

    // 跳過一些數(shù)據(jù) (總是0)
    Read32( fpPSD );
    Read16( fpPSD );

    // 讀取通道數(shù)
    ChannelCount = Read16( fpPSD );

    // 確定至少有一個(gè)通道
    if ( ( ChannelCount < 0 ) || ( ChannelCount > MAX_PSD_CHANNELS ) ) {
      return E_FAIL;
    }

    // 讀入寬和高
    dwHeight = Read32( fpPSD );
    dwWidth = Read32( fpPSD );
    if ( dwWidth != ( DWORD )lSurfWidth ||
dwHeight != ( DWORD )lSurfHeight ) {
      return E_FAIL;
    }

    // 只讀入8位通道
    if ( Read16( fpPSD ) != 8 ) {
      return E_FAIL;
    }

    // 確定模式為RGB.
    // 可能值:
    // 0: 位圖
    // 1: 灰階
    // 2: 索引
    // 3: RGB
    // 4: CMYK
    // 7: Multichannel
    // 8: Duotone
    // 9: Lab

    if ( Read16( fpPSD ) != 3 ) {
      return E_FAIL;
    }

    // 跳過數(shù)據(jù)(如調(diào)色板)
    int ModeDataCount = Read32( fpPSD );
    if ( ModeDataCount )
      fseek( fpPSD, ModeDataCount, SEEK_CUR );

    // 跳過數(shù)據(jù)(如:pen tool paths, etc)
    int ResourceDataCount = Read32( fpPSD );
    if ( ResourceDataCount )
      fseek( fpPSD, ResourceDataCount, SEEK_CUR );

    // 條過保留數(shù)據(jù)
    int ReservedDataCount = Read32( fpPSD );
    if ( ReservedDataCount )
      fseek( fpPSD, ReservedDataCount, SEEK_CUR );

    // 0: 非壓縮
    // 1: RLE壓縮

    CompressionType = Read16( fpPSD );
    if ( CompressionType > 1 ) {
      return E_FAIL;
    }

    BYTE* PSDPixels = new BYTE[ ( lSurfWidth * lSurfHeight ) * 4 ];

    // 解包數(shù)據(jù)
    UnPackPSD( fpPSD, lSurfWidth, lSurfHeight, PSDPixels, ChannelCount, CompressionType );

    fclose( fpPSD );

    // 復(fù)制信息
    BITMAPINFO BitmapInfo;
    ZeroMemory( &BitmapInfo, sizeof( BitmapInfo ) );
    BitmapInfo.bmiHeader.biSize = sizeof( BitmapInfo.bmiHeader );
    BitmapInfo.bmiHeader.biWidth = lSurfWidth;
    BitmapInfo.bmiHeader.biHeight = -lSurfHeight;
    BitmapInfo.bmiHeader.biPlanes = 1;
    BitmapInfo.bmiHeader.biBitCount = 32;

    m_lpDDS7->GetDC( &hDC );

    int rc = StretchDIBits( hDC,
                0,
                0,
                lSurfWidth,
                lSurfHeight,
                0,
                0,
                lSurfWidth,
                lSurfHeight,
                PSDPixels,
                &BitmapInfo,
                DIB_RGB_COLORS,
                SRCCOPY );

    m_lpDDS7->ReleaseDC( hDC );

    if ( rc == GDI_ERROR ) {
      H_ARRAY_DELETE( PSDPixels );

  #ifdef _DEBUG
    g_pHERR->OutDebugMsg( 3, H2DSERR_INVALID_PSD );
  #endif
    return E_FAIL;

    }

    // 是否讀取Alpha混合通道
    if( ChannelCount > 3 ) {
      m_pbAlphaMask = new BYTE[ lSurfWidth * lSurfHeight ];

    for ( int x = 0; x < lSurfWidth; x++ )
      for ( int y = 0; y < lSurfHeight; y++ ) {
        m_pbAlphaMask[ ( y * lSurfWidth ) + x ] =
                PSDPixels[ ( ( ( y * lSurfHeight ) + x ) * 4 ) + 3 ];
      }
    }
    else {
      m_pbAlphaMask = NULL;
    }

    H_ARRAY_DELETE( PSDPixels );

    return DD_OK;
  }

  // PSD文件解包
 
  void CHades2DSurface::UnPackPSD( FILE *fp,     // fp為PSD文件指針,
                   DWORD dwWidth,  
// dwWidth、dwHeight為寬高,
                   DWORD dwHeight,
                   BYTE* pixels,
   // pixels為解包目標(biāo)指針,
                   WORD ChannelCnt,
  // ChannelCnt為通道數(shù),
                   WORD Compression )
// Compression位壓縮類型。
                
                
  {
    int Default[4] = { 0, 0, 0, 255 };
    int chn[4] = { 2, 1, 0, 3};
    int PixelCount = dwWidth * dwHeight;

    if ( Compression ) {
      fseek( fp, dwHeight * ChannelCnt * 2, SEEK_CUR );

      for ( int c = 0; c < 4; c++ ) {
        int pn = 0;
        int channel = chn[c];

        if ( channel >= ChannelCnt ) {
          for ( pn=0; pn < PixelCount ;pn++ ) {
            pixels[ ( pn * 4 ) + channel ] = Default[ channel ];
          }
        }
        else
// 非壓縮
        {
          int count = 0;
          while( count < PixelCount ) {
            int len = fgetc( fp );
            if( len == 128 ) { }
            else if ( len < 128 ) // 非RLE
            {
              len++;
              count += len;
              while(len) {
                pixels[ ( pn * 4 ) + channel ] = fgetc( fp );
                pn++;
                len--;
              }
            }
             else if ( len > 128 )
// RLE打包
            {
              len ^= 0x0FF;
              len += 2;
              unsigned char val = fgetc( fp );
              count += len;
              while( len ) {
                pixels[ ( pn * 4 ) + channel ] = val;
                pn++;
                len--;
              }
            }
          }
        }
      }
    }
    else
    {
      for ( int c=0; c < 4; c++ ) {
        int channel = chn[c];
        if ( channel > ChannelCnt ) {
          for( int pn = 0; pn < PixelCount; pn++ ) {
            pixels[ ( pn * 4 ) + channel ] = Default[ channel ];
          }
        }
        else {
          for( int n = 0; n < PixelCount; n++ ) {
            pixels[ ( n * 4 ) + channel ] = fgetc( fp );
          }
        }
      }
    }
  }

posted on 2008-12-26 18:15 大海 閱讀(1423) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 圖像

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国内精品久久久久伊人av| 午夜在线电影亚洲一区| 欧美成人免费全部| 亚洲一区免费| 欧美电影打屁股sp| 性欧美18~19sex高清播放| 亚洲欧洲精品一区二区三区波多野1战4 | 99视频国产精品免费观看| 午夜精品国产精品大乳美女| 亚洲国内自拍| 亚洲视频在线观看免费| 亚洲自拍偷拍一区| 久久久国产午夜精品| 久热这里只精品99re8久| 美女脱光内衣内裤视频久久影院| 免费久久精品视频| 亚洲国产精品一区制服丝袜| 美女图片一区二区| 亚洲第一级黄色片| 亚洲精品乱码久久久久久久久 | 99国产精品久久久久久久| 欧美/亚洲一区| 亚洲青色在线| 亚洲免费在线精品一区| 久久一区二区三区四区| 欧美日韩视频在线第一区| 国产精品美女午夜av| 红桃视频一区| 久久99伊人| 亚洲四色影视在线观看| 亚洲欧美高清| 欧美精品一区二区视频| 国产一区二区三区四区hd| 日韩视频免费观看高清完整版| 亚洲制服av| 亚洲精品一区二区三区不| 欧美一区2区三区4区公司二百| 最新成人av网站| 欧美在线免费观看亚洲| 欧美日韩美女在线| 一本色道久久综合| 亚洲国产99精品国自产| 玖玖精品视频| 91久久精品美女高潮| 噜噜噜噜噜久久久久久91| 久久久久久久久久久久久9999| 国产一区二区精品久久91| 亚洲最新在线视频| 一本色道综合亚洲| 国产精品久久一卡二卡| 午夜精品网站| 久久精品一区二区国产| 亚洲成色精品| 亚洲精品免费看| 欧美三级午夜理伦三级中视频| 亚洲亚洲精品在线观看| 99精品欧美一区二区三区综合在线| 欧美日韩在线播放| 久久久久久9| 国产精品高清网站| 欧美激情日韩| 狠狠色2019综合网| 亚洲一区久久久| 在线亚洲精品| 久久香蕉精品| 久久免费视频在线| 国产精品久久激情| 亚洲免费观看高清完整版在线观看熊| 国产精品国产自产拍高清av| 蜜臀91精品一区二区三区| 国产精品视频福利| 91久久久久久久久久久久久| 亚洲日本乱码在线观看| 国产精品草莓在线免费观看| 亚洲视频精品| 久久久久国产一区二区| 亚洲国产老妈| 欧美在线亚洲在线| 国产综合久久久久影院| 美日韩免费视频| 美国十次了思思久久精品导航| 亚洲经典三级| 亚洲免费观看| 国产伦精品一区二区三区高清| 久久成人综合视频| 久久久精品一区| 久久久综合视频| 99re6这里只有精品视频在线观看 99re6这里只有精品 | 亚洲啪啪91| 欧美日韩综合在线| 小黄鸭精品aⅴ导航网站入口| 欧美在线一二三| 亚洲精品视频一区| 亚洲视频导航| 校园激情久久| 99国产精品久久久久老师 | 久久成人人人人精品欧| 激情欧美亚洲| 亚洲精品资源| 国产精品青草久久| 欧美高清视频一区二区三区在线观看| 欧美精品免费看| 久久久久国产精品麻豆ai换脸| 欧美电影美腿模特1979在线看| 性欧美1819性猛交| 欧美国产亚洲视频| 久久久久看片| 国产精品免费观看视频| 亚洲黄网站在线观看| 国产自产2019最新不卡| 亚洲最新视频在线播放| 亚洲第一毛片| 久久av免费一区| 亚洲综合999| 欧美国产日韩一区二区三区| 久久久久久97三级| 亚洲尤物视频网| 欧美四级电影网站| 久久激情视频久久| 欧美日韩另类国产亚洲欧美一级| 欧美中文字幕久久| 欧美三级视频| 亚洲经典在线看| 国产一区二区三区四区老人| 一区二区三区日韩在线观看| 久久亚洲精品中文字幕冲田杏梨| 99亚洲一区二区| 久久久中精品2020中文| 久久精品卡一| 免费观看欧美在线视频的网站| 欧美中文字幕视频| 国产精品人人做人人爽 | 一区二区三区av| 久久综合色影院| 性欧美xxxx大乳国产app| 亚洲区一区二区三区| 国产视频一区二区在线观看 | 久久欧美肥婆一二区| 亚洲欧美一区二区精品久久久| 欧美激情小视频| 亚洲国产成人在线播放| 日韩网站在线观看| 欧美日韩大陆在线| 一区二区三区欧美在线观看| 亚洲欧美日本视频在线观看| 欧美日韩在线播放一区| 日韩视频欧美视频| 亚洲在线1234| 国产女人18毛片水18精品| 国产欧美一区二区精品忘忧草 | 在线欧美不卡| 久久久久久亚洲精品杨幂换脸 | 国产啪精品视频| 亚洲欧美日韩在线高清直播| 亚洲综合三区| 国产永久精品大片wwwapp| 久久精品一区中文字幕| 欧美不卡高清| 一区二区精品| 国产精品一区二区三区久久| 午夜一区二区三区不卡视频| 久久只有精品| 亚洲乱码国产乱码精品精| 欧美精品一区二区三区蜜臀| 亚洲另类在线一区| 欧美在线一区二区| 亚洲第一二三四五区| 亚洲高清资源| 久久久久久色| 亚洲国产精品第一区二区| 在线中文字幕一区| 国产精品一区二区三区四区| 久久av老司机精品网站导航| 女人香蕉久久**毛片精品| 亚洲理伦在线| 国产婷婷色一区二区三区四区| 久久中文字幕一区二区三区| 99精品福利视频| 久久综合九色欧美综合狠狠| 欧美日韩色一区| 午夜久久一区| 亚洲精品系列| 美女日韩在线中文字幕| 亚洲欧美日韩第一区| 看片网站欧美日韩| 一本色道久久88综合日韩精品| 久久免费国产| 亚洲欧美在线高清| 伊甸园精品99久久久久久| 日韩午夜av电影| 国产精品女人网站| 亚洲精选视频免费看| 久久久久久97三级| 亚洲午夜高清视频| 在线观看欧美视频| 国产精品视频一二三| 蜜臀va亚洲va欧美va天堂| 亚洲自拍都市欧美小说| 亚洲人成人一区二区三区| 欧美在线视频免费观看|