介绍*.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;}// 版本必须为1if ( 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: Labif ( 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 _DEBUGg_pHERR->OutDebugMsg( 3, H2DSERR_INVALID_PSD );#endifreturn 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 );}}}}}
fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。 这两个函数的原型为: fp 为文件 指针,format 为格式控制字符串,... 表示参数列表。与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参
问题内容: 给定文件大小(以字节为单位),我想使用 IEC(二进制)前缀 将其格式化为 3个 有效数字, 并带有结尾的零,例如1883954变为1.80M。 bash不支持浮点算术,因此我改用awk。问题是我不怎么保持尾随零。当前解决方案: (文件不是那么大,所以我不必考虑更大的单位。) 编辑:这还有另一个问题。请参阅下面的AdrianFrühwirth的评论。 问题答案: GNU Coreuti
本文向大家介绍C#读取csv格式文件的方法,包括了C#读取csv格式文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#读取csv格式文件的方法。分享给大家供大家参考。具体实现方法如下: 一、CSV文件规则 1 开头是不留空,以行为单位。 2 可含或不含列名,含列名则居文件第一行。 3 一行数据不跨行,无空行。 4 以半角逗号(即,)作分隔符,列为空也要表达其存在。 5 列内
本文向大家介绍PHP读取XML格式文件的方法总结,包括了PHP读取XML格式文件的方法总结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了PHP读取XML格式文件的方法。分享给大家供大家参考,具体如下: books.xml文件: 1.DOMDocument方法 2.用 SAX 解析器读取 XML: 3.用正则表达式解析 XML: 4.解析XML到数组 5.检查XML是否有效 6.可用于精确
问题内容: 我有一个fortran程序会生成未格式化的文件,并且正在尝试将它们读入Python。 我有源代码,因此我知道第一个“块”是的字符数组,依此类推。所以我开始 并且是一个80长度的元组,由长度为1的字符串组成;其中一些内容是十六进制字符串(例如)。如何将这个变量转换为单个ascii字符串? 问题答案: 大多数Fortran未格式化文件将包含额外的字节来指定记录的长度。记录是用单个Fortr
本文向大家介绍Python如何读取文件中图片格式,包括了Python如何读取文件中图片格式的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python如何读取文件中图片格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 正常情况下,图片命名的后缀和图片的格式一致,但可能某些情况下,图片的原格式和命名的后缀不一样,查看图片的实际格式 以
本文向大家介绍Python使用xlrd读取Excel格式文件的方法,包括了Python使用xlrd读取Excel格式文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python使用xlrd读取Excel格式文件的方法。分享给大家供大家参考。具体如下: 使用xlrd能够很方便的读取excel文件内容,而且这是个跨平台的库,能够在windows,linux/unix,等平台上面使用,
V2Ray 的配置文件形式如下,客户端和服务器通用一种形式,只是实际的配置不一样。 { "log": {}, "api": {}, "dns": {}, "stats": {}, "routing": {}, "policy": {}, "reverse": {}, "inbounds": [], "outbounds": [], "transport":