C++ Builder XE4 > 画像処理 > 4つのファイル画像を合成してTImageとして表示

```txt:動作環境
C++ Builder XE4
```

### 処理概要

- 4つのpngファイルがある
- 4つのファイルを読込み、上下左右2x2で合成する

### 参考

- [Joining image - Delphi](https://stackoverflow.com/questions/31930783/joining-image-delphi)
    - Delphi実装
    - 回答にある実装コードに間違いあると思われる (2018-12-25 16:10の時点)
        - `jpg.Assign(bmp);`
        - は正しくは
        - `jpg.Assign(bmp1);`
        - と思われる
            - 訂正(2018-12-26) : 回答者のコメントにより間違いでないことが分かりました。

### 用意する画像

- ペイントブラシで100x100の４つの画像を作成
    - green.png, red.png, orange.png, blue.png
    - 各色を塗った画像とする


### フォームデザイン

![2018-12-25_16h53_23.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ffbaebb0-2737-98b4-5829-6dc411a0156a.png)

- 200x200のTImage(Image1)を配置

### 実装

```Unit1.hpp
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TImage *Image1;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <pngimage.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static const int kWidth_eachImage = 100;  // 個々のファイルの幅[ピクセル]
static const int kHeight_eachImage = 100;  // 個々のファイルの高さ[ピクセル]

static const String kFilenames[] = {
	L"red.png",
	L"green.png",
	L"blue.png",
	L"orange.png",
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TBitmap *bmpptr = new TBitmap();
	TPngImage *pngptr = new TPngImage();

	bmpptr->SetSize( kWidth_eachImage * 2, kHeight_eachImage * 2 ); // 200: 個々の画像サイズ100の2倍 (4つの画像を正方形に並べるため)


	int idx = 0; // ファイル名のインデックス用
	for(int ri = 0; ri < 2; ri++) {  // ri: row index
		for(int ci = 0; ci < 2; ci++) {  // ci: column index
			pngptr->LoadFromFile(kFilenames[idx]);
			bmpptr->Canvas->Draw(kWidth_eachImage * ri, kHeight_eachImage * ci, pngptr);
			idx++;
		}
	}
	Image1->Picture->Assign(bmpptr);

	delete pngptr;
	delete bmpptr;
}
//---------------------------------------------------------------------------
```

### 動作例

![2018-12-25_16h54_20.png](https://qiita-image-store.s3.amazonaws.com/0/32870/43d0cba0-08f9-1910-e8ef-ccf53280b295.png)


### 備考

- 高解像度画像キャプチャに使おうとしているがうまくいくかは不明

- pngを使うため`#include <pngimage.hpp>`をしている
    - [c++ builder XE4, 10.2 Tokyo > TImage > 画像のファイル拡張子(.png)が不明です](https://qiita.com/7of9/items/9edf309c5f58cec126ff)