LoginSignup
0
1

More than 5 years have passed since last update.

C++ Builder XE4 > 画像処理 > 4つのファイル画像をN個合成して、表示枠を超える画像を作成する + クリップボードへ送る > ペイントブラシで画像を端から端まで貼付けできるか?

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

前回

今回の処理

  • 画面に表示しきれないサイズの画像を用意する
  • クリップボードへ送る
  • ペイントブラシでctrl+vした時に画像がすべて貼付けできるか

必要となるファイル

「前回」の記事に記載しているように4つのpngファイルが必要

実装

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 <ClipBrd.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 int kNum_images = 4; // 使用するkFilenames[]の要素数
static const String kFilenames[] = {
    L"red.png",
    L"green.png",
    L"blue.png",
    L"orange.png",
};

static const int kNum_loop = 9; // 水平、垂直の繰返し数(奇数にすることで市松模様に)

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // 1. Image1のサイズを設定
    Image1->Width = kWidth_eachImage * kNum_loop;
    Image1->Height = kHeight_eachImage * kNum_loop;

    // 2. 画像を読込んで並べる
    TBitmap *bmpptr = new TBitmap();
    TPngImage *pngptr = new TPngImage();
    //
    // 個々の画像サイズのN倍 (市松模様に並べる)
    bmpptr->SetSize( kWidth_eachImage * kNum_loop, kHeight_eachImage * kNum_loop );
    //
    int idx = 0; // ファイル名のインデックス用
    for(int ri = 0; ri < kNum_loop; ri++) {  // ri: row index
        for(int ci = 0; ci < kNum_loop; ci++) {  // ci: column index
            pngptr->LoadFromFile(kFilenames[idx % kNum_images]);
            bmpptr->Canvas->Draw(kWidth_eachImage * ri, kHeight_eachImage * ci, pngptr);
            idx++;
        }
    }
    Image1->Picture->Assign(bmpptr);
    //
    delete pngptr;

    // 3. クリップボードへ
    Clipboard()->Assign(bmpptr);

    // 4, 手仕舞い
    delete bmpptr;

   //  5. ペイントブラシ起動 (ctrl + vでの動作確認用)
    ShellExecute(NULL, NULL, L"pbrush.exe", L"", NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

動作例

  1. ソフトを実行して、Button1を押下する
    • => 合成画像がImage1に表示される
    • => ペイントブラシが起動される
  2. ctrl + vで画像を貼付ける
    • => 画像を端から端まで貼付けできる

フォーム上の表示 (一部隠れている)
2018-12-25_17h42_58.png

ペイントブラシへの貼付け後
2018-12-25_17h42_43.png

備考

何故こういうことを試したか。

FastReportへ画像を送ろうとした時、画像の一部しか送ることができなかった。
画像の端から端まで送る方法を検討中に上記を実施した。

0
1
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
1