gd-latest-win32.zip : GD 2.0.34( bgd.dll )
↑でダウンロードした中にある bgd.dll と ヘッダファイルを↓を解凍した中にコピーします ブラウザでダウンロード Why does bgd.dll crash with my C program?VC6.0 時代に作ったコードを久しぶりに使ったら異常終了するので調べたら、 .NET のコンパイラでは、FILE * を使うな との事。 ( そのかわり、/MT でも動作します ) とりあえず今後の為にサンプルを書きました。 「オリジナルドキュメントのまま」の部分は、ファイルサイズが解れば どんな書き方でも構わないのですが、とりあえずそのままで。 #define _WIN32_WINNT 0x0500 #include <tchar.h> #include "lightbox\lightbox.h" #pragma comment( lib, "lightbox\\lightbox.lib" ) #pragma comment( lib, "shlwapi.lib" ) #pragma comment( lib, "wininet.lib" ) #include <sys/types.h> #include <sys/stat.h> #include "gd.h" typedef gdImagePtr (__stdcall *LPFUNC_gdImageCreateFromPngPtr)( int, void * ); typedef void (__stdcall *LPFUNC_gdImageLine)( gdImagePtr, int, int, int, int, int ); typedef void * (__stdcall *LPFUNC_gdImagePngPtr)( gdImagePtr, int * ); typedef void (__stdcall *LPFUNC_gdImageDestroy)( gdImagePtr ); typedef int (__stdcall *LPFUNC_gdImageColorAllocate)( gdImagePtr, int, int, int ); #define LOAD_FUNC(name,no) \ LPFUNC_##name Dll_##name; \ Dll_##name = \ (LPFUNC_##name)GetProcAddress( \ lib, "_" #name #no \ ); \ if ( Dll_##name == NULL ) { \ printf( "関数アドレス取得エラー\n" ); \ return false; \ } int _tmain(int argc, _TCHAR* argv[]) { // ***************************************************** // DLL ロード // ***************************************************** HINSTANCE lib; lib = LoadLibrary( "bgd.dll" ); // ***************************************************** // ファイルを開く // ***************************************************** FILE *fp; fp = fopen( "test.png", "rb" ); if ( fp == NULL ) { printf( "ファイル OPEN エラー\n" ); return false; } // ***************************************************** // オリジナルドキュメントのまま // ***************************************************** struct stat stat_buf; if (fstat(fileno(fp), &stat_buf) != 0) { return false; } char *buffer = (char *)malloc(stat_buf.st_size); if (!buffer) { return false; } if ( fread(buffer, 1, stat_buf.st_size, fp) != stat_buf.st_size) { return false; } // ***************************************************** // PNG ファイルより gdImagePtr を作成 // ***************************************************** LOAD_FUNC(gdImageCreateFromPngPtr,@8) gdImagePtr im; im = Dll_gdImageCreateFromPngPtr(stat_buf.st_size, buffer); free(buffer); // ***************************************************** // ファイルを閉じる // ***************************************************** fclose(fp); // ***************************************************** // 色作成 // ***************************************************** LOAD_FUNC(gdImageColorAllocate,@16) int color; color = Dll_gdImageColorAllocate(im, 0, 0, 0 ); // ***************************************************** // 直線 // ***************************************************** LOAD_FUNC(gdImageLine,@24) int i; for( i = 0; i < 20; i++ ) { Dll_gdImageLine(im, 0, i*10, 219, i*10, color ); } // ***************************************************** // 保存 // ***************************************************** LOAD_FUNC(gdImagePngPtr,@8) char *ptr; int size; ptr = (char *)Dll_gdImagePngPtr(im, &size ); fp = fopen( "test2.png", "wb" ); fwrite( ptr, size, 1, fp ); fclose( fp ); // ***************************************************** // 破棄 // ***************************************************** LOAD_FUNC(gdImageDestroy,@4) Dll_gdImageDestroy( im ); FreeLibrary( lib ); return 0; } |