ÒÔÎı¾·½Ê½²é¿´Ö÷Ìâ

-  ¼ÆËã»ú¿ÆÑ§ÂÛ̳  (http://bbs.xml.org.cn/index.asp)
--  ¡º C/C++±à³Ì˼Ïë ¡»  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  PSD¸ñʽÎļþµÄ¶ÁÈ¡  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=46508)


--  ×÷Õߣº¾í»ýÄÚºË
--  ·¢²¼Ê±¼ä£º5/7/2007 10:44:00 AM

--  PSD¸ñʽÎļþµÄ¶ÁÈ¡
PhotoShop£¬ÎÒÏëûÓÐÈ˻᲻֪µÀ°É¡£ÆäͼÏóÎļþ*.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 );
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡}
¡¡¡¡}






--  ×÷Õߣºzjun001
--  ·¢²¼Ê±¼ä£º1/7/2008 3:39:00 PM

--  ÇëÎÊÓÐûÓа취 ¶Á³ö  psdÎļþÖеĸ÷ͼ²ãµÄ»ìºÏÑ¡Ïî
±ÈÈç˵£¬ÎÒÒªÓóÌÐò ÅÐ¶Ï Ä³¸öpsdÎļþµÄij¸ö ͼ²ã ÊÇ·ñÓ¦ÓÃÁË¡°Ð±ÃæºÍ¸¡µñ¡°µÄЧ¹û¡¢ÒÔ¼°¸÷²ÎÊýµÄÉèÖÃÊÇ·ñ·ûºÏ ÒªÇó¡£
    ÈçÄܻش𣬾ͰïÁËÎÒÒ»¸ö´ó棬ÎÒÕÒÏà¹Ø×ÊÁ϶¼¿ìÕÒ·èÁË¡£
W 3 C h i n a ( since 2003 ) Æì Ï վ µã
ËÕICP±¸05006046ºÅ¡¶È«¹úÈË´ó³£Î¯»á¹ØÓÚά»¤»¥ÁªÍø°²È«µÄ¾ö¶¨¡·¡¶¼ÆËã»úÐÅÏ¢ÍøÂç¹ú¼ÊÁªÍø°²È«±£»¤¹ÜÀí°ì·¨¡·
46.875ms