Title

いろんなサイズのテスト画像をたくさん作るには

アプリのUIなんか作っていると、要所要所でPNG画像が必要になるのですが、ひとまずテスト画像で進めたいことはよくありますよね。
まったくないと試せないので。

少量ならPhotoshopとかで適当に作れば良いのですが、量が多いと面倒です。
コマンドラインでサイズ指定したら画像ができるみたいなことはやれば出来ると思うんですが、とっさにいつも無いので作りました。

同じもの作るの3回目くらいなんですが、いつもどこかいってしまってファイル名すら思い出せないので今回はここに貼っておきます。

createTestImage.zip(WIN32)

引数にファイル名 横サイズ 縦サイズ を入れるとランダムな色の背景の画像にファイル名が入った画像ファイルが生成されます。
ファイル名にスペースとか入れられないですので、諦めるかソースコード修正してください。

>createTestImage.exe createTestImage.png 200 100

↓こういう画像ができます。

ソースコード

#include <Windows.h>
#include <gdiplus.h>
#include <string>
#include <time.h>  
#include <stdio.h>
#include <tchar.h>

#pragma comment(lib,"Gdiplus.lib")

using namespace Gdiplus;

#include <cstdlib>
using namespace std;
ULONG_PTR           gdiToken;
GdiplusStartupInput gdiSI;

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
	UINT  num = 0;
	UINT  size = 0;
	Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
	Gdiplus::GetImageEncodersSize(&num, &size);
	if (size == 0) return -1;

	pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
	if (pImageCodecInfo == NULL) return -1;
	GetImageEncoders(num, size, pImageCodecInfo);
	for (UINT j = 0; j < num; ++j)
	{
		if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
		{
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;
		}
	}

	free(pImageCodecInfo);
	return -1;
}

void createImage(WCHAR *filename,int width,int height)
{
	Bitmap *outputImage = new Bitmap(width, height, PixelFormat32bppARGB);

	Gdiplus::Graphics graphics(outputImage);
	graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);

	Pen pen(Color(255, 0, 0, 0), 2);
	int r = (int)((double)rand() / (RAND_MAX + 1) * (128) + 127);
	int g = (int)((double)rand() / (RAND_MAX + 1) * (128) + 127);
	int b = (int)((double)rand() / (RAND_MAX + 1) * (128) + 127);

	graphics.Clear(Color(255, r, g, b));
	graphics.DrawRectangle(&pen, 0, 0, width-1, height-1);

	TCHAR sizeText[100];
	wsprintf(sizeText, L"%dx%d", width, height);

	Font fontMain(L"Arial", 14);
	Font fontSize(L"Arial", 9);
	StringFormat format;
	format.SetAlignment(StringAlignmentCenter);
	Gdiplus::SolidBrush blackBrush(Color(255, 0, 0, 0));

	graphics.DrawString(filename, -1, &fontMain, RectF(0.0f, 3.0f, width - 1.0f, height - 1.0f), &format, &blackBrush);
	graphics.DrawString(sizeText, -1, &fontSize, RectF(0.0f, 28.0f, width - 1.0f, height - 1.0f), &format, &blackBrush);


	CLSID id;
	GetEncoderClsid(L"image/png", &id);
	outputImage->Save(filename, &id);

	delete outputImage;

}
int _tmain(int argc, _TCHAR* argv[])
{
	if (argc <= 3)
	{
		printf("createTestImage Size Filename\n\n");

		printf("for example:\n\ncreateTestImage.exe testimage.png 128 256\n\n\n");
		return 0;
	}


	srand((unsigned)time(NULL));
	GdiplusStartup(&gdiToken, &gdiSI, NULL);

	createImage(argv[1], _wtoi(argv[2]), _wtoi(argv[3]));

	Gdiplus::GdiplusShutdown(gdiToken);
	return 0;
}

ご覧頂けるとおり、エラー処理入ってません!

Leave a Reply

E-Mail (will not be published)
Comment
*

カレンダー

2024年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

▲Pagetop