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

c++初學者

專注技術開發

[轉]PSD格式文件的讀取

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

  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;
// 通道數

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

    // 頭四個字節為"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;
    }

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

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

    // 確定至少有一個通道
    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;
    }

    // 跳過數據(如調色板)
    int ModeDataCount = Read32( fpPSD );
    if ( ModeDataCount )
      fseek( fpPSD, ModeDataCount, SEEK_CUR );

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

    // 條過保留數據
    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 ];

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

    fclose( fpPSD );

    // 復制信息
    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為解包目標指針,
                   WORD ChannelCnt,
  // ChannelCnt為通道數,
                   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 大海 閱讀(1436) 評論(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>
            国产亚洲精品自拍| 宅男在线国产精品| 欧美.www| 久热精品在线视频| 亚洲人成艺术| 日韩亚洲欧美成人| 国产精品久久国产三级国电话系列| 一区二区三区成人精品| 日韩一级黄色大片| 国产精品亚洲综合色区韩国| 久久久精品五月天| 久久人人爽人人爽| 一本色道久久88精品综合| 一区二区三区四区五区视频| 国产欧美日韩在线观看| 久久伊伊香蕉| 欧美日韩高清免费| 久久精品30| 欧美成人官网二区| 香蕉成人久久| 麻豆精品网站| 亚洲专区欧美专区| 久久欧美中文字幕| 亚洲永久免费精品| 久久久蜜臀国产一区二区| 日韩天天综合| 欧美伊人精品成人久久综合97| 亚洲高清免费| 亚洲欧美国产一区二区三区| 亚洲成色www8888| 日韩一级在线| 一区二区在线视频观看| 亚洲精品综合在线| 狠狠色综合色区| 夜夜嗨av一区二区三区中文字幕 | 欧美午夜电影网| 久久一区中文字幕| 国产精品久久久久久久久久直播| 久久在线观看视频| 国产精品video| 欧美搞黄网站| 国产亚洲欧美aaaa| 99精品久久久| 亚洲精品久久久久久久久久久久| 香蕉久久精品日日躁夜夜躁| 日韩一级精品| 免费精品视频| 另类综合日韩欧美亚洲| 国产精品影院在线观看| 亚洲精品在线观| 亚洲激情在线观看| 久久嫩草精品久久久精品| 欧美一区二区三区视频在线观看 | 欧美日韩免费观看中文| 欧美91视频| 狠狠色综合播放一区二区| 亚洲一线二线三线久久久| 这里只有精品在线播放| 亚洲精品影院| 国产欧美一区二区三区视频| 亚洲丶国产丶欧美一区二区三区| 国产欧美在线观看| 一区二区三区日韩欧美| 一本色道综合亚洲| 欧美精品久久久久久| 亚洲国产成人久久综合| 亚洲国产成人久久| 久久中文精品| 亚洲成色777777在线观看影院| 黄色免费成人| 久久理论片午夜琪琪电影网| 久久午夜av| 精品动漫av| 另类国产ts人妖高潮视频| 欧美777四色影视在线| 亚洲黄色小视频| 欧美国产丝袜视频| 亚洲国产精品视频| 一区二区日韩欧美| 国产精品免费电影| 久久xxxx| 欧美国产视频在线观看| 亚洲美女免费精品视频在线观看| 免费欧美在线| 亚洲美女视频| 欧美一区二区三区四区高清| 国产日韩在线视频| 久久久久久9999| 亚洲精品日本| 午夜精品电影| 在线观看亚洲精品视频| 欧美激情第二页| 亚洲视频在线播放| 久久蜜桃精品| 日韩视频免费观看| 国产乱码精品一区二区三区av| 欧美一区二区三区啪啪| 欧美国产日韩一区二区| 亚洲主播在线| 亚洲国产精品123| 欧美视频在线观看| 先锋影音国产一区| 亚洲区一区二区三区| 午夜视频在线观看一区| 激情欧美一区二区| 欧美性猛交xxxx乱大交蜜桃| 欧美在线影院| 日韩视频一区二区| 免费看的黄色欧美网站| 亚洲欧美日韩一区二区三区在线观看| 国内自拍亚洲| 欧美女激情福利| 久久国产色av| 亚洲一区精彩视频| 欧美激情一级片一区二区| 欧美一区日韩一区| 99精品欧美一区二区蜜桃免费| 国产日韩欧美在线看| 欧美私人网站| 欧美巨乳在线观看| 久久婷婷蜜乳一本欲蜜臀| 亚洲一区二区成人| 亚洲区中文字幕| 欧美激情精品久久久久久免费印度 | 国产欧美精品xxxx另类| 欧美伦理视频网站| 久久综合九色综合欧美狠狠| 欧美一区二区免费视频| 日韩亚洲欧美在线观看| 亚洲国产第一| 欧美激情亚洲视频| 欧美不卡福利| 美国三级日本三级久久99| 欧美一级一区| 西瓜成人精品人成网站| 亚洲午夜视频| 亚洲视频一起| 亚洲午夜久久久久久久久电影院 | 国产精品国产自产拍高清av王其| 欧美成人福利视频| 蜜臀久久99精品久久久久久9| 久久精品视频va| 久久精品官网| 久久亚洲私人国产精品va媚药| 欧美一区二区免费| 久久精品99国产精品酒店日本| 性一交一乱一区二区洋洋av| 午夜精品久久久99热福利| 亚洲一品av免费观看| 午夜亚洲性色福利视频| 久久国产福利国产秒拍| 久久久久久自在自线| 久久精品国产亚洲aⅴ| 久久精品成人| 久久三级视频| 欧美激情视频给我| 欧美人与性动交cc0o| 国产精品高潮呻吟久久| 国产亚洲精品高潮| 伊人久久成人| 99re6热只有精品免费观看| 9国产精品视频| 亚洲视频在线观看网站| 欧美一区二区精美| 久久乐国产精品| 欧美国产精品久久| 日韩一级大片| 性久久久久久| 噜噜噜久久亚洲精品国产品小说| 欧美xxx在线观看| 欧美午夜电影在线观看| 国产真实乱偷精品视频免| 亚洲电影成人| 亚洲新中文字幕| 久久久亚洲国产天美传媒修理工| 欧美大成色www永久网站婷| 日韩亚洲欧美中文三级| 欧美在线三区| 欧美精品久久一区二区| 国产精品丝袜久久久久久app| 一区二区三区在线观看欧美 | 尤物精品国产第一福利三区 | 国产专区欧美精品| 亚洲精品乱码久久久久久按摩观| 亚洲已满18点击进入久久 | 99re6热在线精品视频播放速度 | 激情欧美一区二区三区| 99精品视频免费全部在线| 久久精品国产精品亚洲| 亚洲激情影视| 欧美在线观看天堂一区二区三区| 美女亚洲精品| 国产日韩欧美一区二区三区四区| 最新国产成人在线观看| 欧美在线视频一区| 一本色道久久综合狠狠躁篇怎么玩 | 欧美日韩一区二区视频在线观看| 激情久久影院| 亚洲欧美综合另类中字| 亚洲黄色在线视频|