GD 2.0.34 のコーディング :【VC++】

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;
}