VC下讀取PSD函式

2021-05-26 02:45:35 字數 3622 閱讀 9056

hresult loadpsd( lpstr strfilename ) // 讀取psd檔案

// 頭四個位元組為"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 )

// 版本必須為1

if ( read16( fppsd ) != 1 )

// 跳過一些資料 (總是0)

read32( fppsd );

read16( fppsd );

// 讀取通道數

channelcount = read16( fppsd );

// 確定至少有乙個通道

if ( ( channelcount < 0 ) || ( channelcount > max_psd_channels ) )

// 讀入寬和高

dwheight = read32( fppsd );

dwwidth = read32( fppsd );

if ( dwwidth != ( dword )lsurfwidth || dwheight != ( dword )lsurfheight )

// 唯讀入8位通道

if ( read16( fppsd ) != 8 )

// 確定模式為rgb.

// 可能值:

// 0: 位圖

// 1: 灰階

// 2: 索引

// 3: rgb

// 4: cmyk

// 7: multichannel

// 8: duotone

// 9: lab

if ( read16( fppsd ) != 3 )

// 跳過資料(如調色盤)

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 )

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 )

// 是否讀取alpha混合通道

if( channelcount > 3 )

}

else

h_array_delete( psdpixels );

return dd_ok;

}

// psd檔案解包

void chades2dsu***ce::unpackpsd( file *fp, // fp為psd檔案指標,

dword dwwidth, // dwwidth、dwheight為寬高,

dword dwheight,

byte* pixels, // pixels為解包目標指標,

word channelcnt,  // channelcnt為通道數,

word compression ) // compression位壓縮型別。

;

int chn[4] = ;

int pixelcount = dwwidth * dwheight;

if ( compression )

}

else // 非壓縮

else if ( len < 128 ) // 非rle

}

else if ( len > 128 ) // rle打包

}

}

}

}

}

else

}

else

}

}

}

}

在VC程式下讀取INI檔案

不論是程式開發人員還是軟體應用人員,都不會對擴充套件名為 ini 的檔案感到陌生,不僅windows作業系統將大名鼎鼎的win.ini作為記錄當前系統狀態,並根據其記錄內容對系統進行配置的一種便捷的方法,而且眾多的應用軟體也廣泛地使用該型別的配置檔案來對軟體進行記錄 配置。本文針對配置設定檔案的使用...

在VC下如何讀取chm檔案

在vc下如何讀取chm檔案 在我用vc呼叫了html help之後,才發現用vc呼叫html help並不是一件簡單的事。在visual c 6中呼叫html help沒有現成的函式,需要呼叫htmlhelp 這個api函式。而在呼叫這個函式之前,還需要在你的工程中加上htmlhelp的庫和標頭檔案...

VC下的函式位址

vc下的函式位址 最近突然有一位同事問我關於虛擬繼承 virtual inheritance 的問題,我記得在 虛擬與多型 繁體版,1998年 裡讀到過,也許當時讀的匆忙,一知半解的,所以現在也答不清楚。於是,我又拿起這本書重新讀了第二章c 物件模型。這一次我讀的仔細多了。在這章的結尾作者,侯捷老師...