2013年6月22日土曜日

ジャケット写真取得に挑戦:IWMHeaderInfo::GetAttributeByName


#include <stdio.h>//printf とかで必要
#include<windows.h>//MessageBox とかで必要

#include <wmsdk.h>
#pragma comment(lib, "wmvcore.lib")

#include "wmp.h"

void main(void)
{

 IWMMetadataEditor * pEditor = NULL;
 IWMHeaderInfo3 * pHeaderInfo = NULL;
 IWMPMedia3 * spCurrMedia3 = NULL;
 //IWMPMedia3* Media;
 //IWMHeaderInfo3

 HRESULT hr = S_FALSE;

 hr = WMCreateEditor(&pEditor);

 hr = pEditor->Open(L"G:\\sampleMovie\\sample.mp3");

 pEditor->QueryInterface(IID_IWMHeaderInfo, (void**) &pHeaderInfo);

 WM_PICTURE* pPicture = NULL;;
 WORD wStreamNum = 0;
 WORD wLength = 0;
 WMT_ATTR_DATATYPE wmtDataType = WMT_TYPE_BINARY;

 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, NULL, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 pPicture = (WM_PICTURE*)new BYTE[wLength];

 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, (BYTE*)pPicture, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 MessageBox(0,0,TEXT("OK"),0);
}


WM_PICTURE structure で調べたら
pwszMIMETypeは image/jpeg
bPictureType が3なので 、前面の写真のようです。

バイナリエディッタでファイルを開いてみた。

jpeg 形式で保存してみる。
// WMPConsoleApplication1.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

#include <stdio.h>
#include <wmsdk.h>

#include "wmp.h"


//#pragma comment(lib, "user32.lib")
#pragma comment(lib, "wmvcore.lib")

using namespace System;
using namespace System::IO;
//using namespace System::IO::MemoryStream;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"プログラムスタート");

 IWMMetadataEditor * pEditor = NULL;
 IWMHeaderInfo3 * pHeaderInfo = NULL;
 IWMPMedia3 * spCurrMedia3 = NULL;

 HRESULT hr = S_FALSE;

 hr = WMCreateEditor(&pEditor);

 hr = pEditor->Open(L"G:\\sampleMovie\\Amanda.wma");

 hr = pEditor->QueryInterface(IID_IWMHeaderInfo, (void**) &pHeaderInfo);

 WM_PICTURE* pPicture = NULL;;
 WORD wStreamNum = 0;
 WORD wLength = 0;
 WMT_ATTR_DATATYPE wmtDataType = WMT_TYPE_BINARY;
 
 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, NULL, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 pPicture = (WM_PICTURE*)new BYTE[wLength];

 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, (BYTE*)pPicture, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 //画像の大きさ
 printf("画像の大きさ:%d \n",pPicture->dwDataLen);

 FILE *fp;        /* ファイル操作で使用する変数 */ 
 fp = fopen( "D:\\sample.jpg"  , "wb" );

 fwrite( pPicture->pbData , pPicture->dwDataLen , 1 , fp ); 

 fclose( fp );

 Console::WriteLine(L"プログラム終了");
 Console::ReadLine();

 return 0;
}

保存に成功しました。

mp3 wma の形式で確認しました。

画像データがないmp3,wmaでは当然画像は取得できません。

ファイルエクスプローラの詳細で画像データが在るか確認できます。

0 件のコメント:

コメントを投稿