LoginSignup
0
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-25
動作環境
C++ Builder XE4

処理概要

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

参考

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

用意する画像

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

フォームデザイン

2018-12-25_16h53_23.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

備考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2