2024/12/25

Notes - Excel 連携:#52)画像のリサイズ

Excel を使ってノーツの ”ニガテ” をカバーしようというこの連載。今回のネタは画像の操作です。LotusScript では、ファイル操作はできても画像ファイルを画像データとして取り扱うことはできません。Java を使えば実現できるようなのですが、ちょっと敷居が高いですよね。

そこで、Excel の出番です。LotusScript + Excel VBA で画像処理にチャレンジしましょう。今回ターゲットにするのは、画像のリサイズとフォーマット変換です。


基本的な仕組み

Excel 上に配置した画像はオブジェクトのサイズを変えるとその大きさにあわせて伸縮してくれます。今回はこの機能をリサイズに活用します。

画像ファイルを作成する方法は 『#36)帳票を画像で保存』で紹介しました。Chart オブジェクトの Export というメソッドをコールするだけででしたね。GIF や PNG など画像形式は保存するファイル名の拡張子で自動的に判別されます。

Chart.Export メソッド (Excel)

この 2 つの機能を組み合わせて、画像ファイルのリサイズとフォーマット変換を行います。大まかな手順は次の通りです。

  1. ワークシートに画像と同じサイズの Chart オブジェクトを作成
  2. Chart 上に画像ファイルを読み込む(Chart オブジェクトにピッタリ収まる)
  3. Chart オブジェクトを希望のサイズに変更(画像がリサイズされる)
  4. Export メソッドで画像ファイルとして出力(拡張子次第でフォーマットを変換)


サンプルプログラム

まず、新規でエージェントを作成し、この連載で作成してきたライブラリ lsXls を組み込みます。とはいっても、使用している関数は単位を変換する PixcelToPoint 関数だけです(『#35)Excel で使用する単位と変換』で紹介)。

エージェントのプログラムの全体は次の通りです。

Option Declare
Use "lsXls"

Sub Initialize
   Dim oXls As Variant
   Dim oSheet As Variant
   Dim oShape As Variant
   Dim oImage As Variant
   Dim sFN_In As String

   '入力画像ファイル
   sFN_In = "C:\tmp\Image_Input.png"

   'Excel の準備
   Set oXls = CreateObject("Excel.Application")
   Call oXls.Workbooks.Add
   Set oSheet = oXls.Workbooks(1).WorkSheets(1)

   '画像サイズ取得
   Dim dX As Double '画像の幅(ポイント)
   Dim dY As Double '画像の高さ(ポイント)
   Set oImage = oSheet.Shapes.AddPicture(sFN_In, msoFalse, msoTrue, 0, 0, -1, -1)
   dX = oImage.Width
   dY = oImage.Height
   MsgBox PointToPixcel(dX)

   'Chart オブジェクトを画像の大きさで作成
   Set oShape = xAddChart(oSheet, dX, dY)

   'Chart 上に画像ファイルを読み込み
   Set oImage = oShape.Chart.Shapes.AddPicture(sFN_In, msoFalse, msoTrue, 0, 0, -1, -1)

   '出力サイズ
   Dim iX_Out As Integer '画像の幅(ピクセル)
   Dim iY_Out As Integer '画像の高さ(ピクセル)
   iX_Out = 334
   iY_Out = 100

   'リサイズ
   dX = dX * (PixcelToPoint(iX_Out)/dX)
   dY = dY * (PixcelToPoint(iY_Out)/dY)
   oShape.Width = dX
   oShape.Height = dY

   '画像として保存
   Call xSaveAsPicture(oShape, "C:\tmp\Image_Output.gif")

   oXls.Visible = True
End Sub

Function xAddChart(voSheet As Variant, ByVal vdWidth As Double, ByVal vdHeight As Double) As Variant
   Dim oShape As Variant

   'Chart を作成(Shape オブジェクト)
   Set oShape = voSheet.Shapes.AddChart2( , , , , vdWidth, vdHeight)
   With oShape
      '背景は透明
      .Fill.Visible = False
      .Line.Visible = False

      'グラフのオブジェクトを削除
      On Error Resume Next
      .Chart.ChartTitle.Delete
      .Chart.Legend.Delete
      .Chart.Axes(xlCategory).Delete
      .Chart.Axes(xlValue).Delete
      .Chart.Axes(xlValue).MajorGridlines.Delete
   End With

   Set xAddChart = oShape
End Function

Function xSaveAsPicture(voIcon As Variant, ByVal vsFileName As String)
   voIcon.Chart.Export vsFileName
End Function

使い方は、

  1. リサイズしたい画像ファイルを sFN_In 変数に設定
  2. 出力サイズを iX_Out、iY_Out 変数にピクセルで指定
  3. xSaveAsPicture 関数の 2 つ目の引数で出力ファイル名を指定

で、実行すると指定した画像ファイルが作成されます。なお、今回はサンプルアプリですので、処理結果がわかるよう、Excel シートを画面に表示して終了しています。


ここから先は、処理のポイントとなる部分をかいつまんで解説します。


画像サイズの取得

リサイズに利用する Chart オブジェクトは、画像サイズにあわせて作成します。そのため、事前に画像サイズを取得する必要があります。

今回は、AddPicture メソッド でいったん画像を呼び出します。この時、最後の 2 つの引数に -1 をセットすると元の画像のサイズを維持して作成されます。できあがったオブジェクト(Shape)のサイズを取得すれば、画像のサイズが取得できるという算段です。

   '画像サイズ取得
   Dim dX As Double '画像の幅(ポイント)
   Dim dY As Double '画像の高さ(ポイント)
   Set oImage = oSheet.Shapes.AddPicture(sFN_In, msoFalse, msoTrue, 0, 0, -1, -1)
   dX = oImage.Width
   dY = oImage.Height


元の画像の準備

画像のサイズが判明したらそのサイズで Chart オブジェクトを作成します。画像の読み込みは、Chart オブジェクトの Shapes に対して AddPicture しているのがポイントですね。

   'Chart オブジェクトを画像の大きさで作成
   Set oShape = xAddChart(oSheet, dX, dY)

   'Chart 上に画像ファイルを読み込み
   Set oImage = oShape.Chart.Shapes.AddPicture(sFN_In, msoFalse, msoTrue, 0, 0, -1, -1)

Chart オブジェクトの作成は、サブ関数 xAddChart で実施しています。この関数では、オブジェクトを作成するだけでなく、今回は無用であるグラフオブジェクトを削除するなどの調整を行っています。


画像のリサイズ

以下が画像をリサイズしている部分です。わかりやすくなるよう画像サイズはピクセル(整数)で指定できるようにしています。ただ、元の画像サイズはポイントですから、PixcelToPoint 関数で変換し、単位をあわせた後、リサイズの比率を計算しています。

   '出力サイズ
   Dim iX_Out As Integer '画像の幅(ピクセル)
   Dim iY_Out As Integer '画像の高さ(ピクセル)
   iX_Out = 334
   iY_Out = 100

   'リサイズ
   dX = dX * (PixcelToPoint(iX_Out)/dX)
   dY = dY * (PixcelToPoint(iY_Out)/dY)
   oShape.Width = dX
   oShape.Height = dY

リサイズ後のサイズ dX, dY が決定したら Shape オブジェクトにセットしています。これで画像はサイズに合わせてリサイズされます。


画像の保存

リサイズした画像をファイルとして出力する関数は xSaveAsPicture 関数が担当しています(『#37)名前アイコン生成 ①』で紹介した関数をそのまま再利用)。

1 行しかない単純な関数で、Chart オブジェクトの Export メソッドをコールしているだけです。このメソッドは拡張子で画像の形式を指定できます。.gif を指定すると GIF、.png で PNG 形式となります。


前回 Notes - Excel 連携


0 件のコメント:

コメントを投稿