ImageKit6で複数の画像を1枚に結合する方法とは?

このQ&Aのポイント
  • ImageKit6を使用して、複数の画像を1枚に結合する方法について教えてください。
  • 具体的には、4枚のtif画像を連結させて縮尺変更し、png形式で保存したいです。
  • 現在はDelphiを使用しておりますが、他のプログラミング言語でも結構です。ご教示ください。
回答を見る
  • ベストアンサー

ImageKit6で複数の画像を1枚に結合したい。

こんにちは。 開発環境ですが、 WindowsXP Pro SP3 Delphi7 でImageKit6のActivXコンポーネントを使ってます。 表題のとおりですが、複数の画像を連結させたいのですが、どのようにするのかわかりません。 マニュアルも一通り見てみたつもりですがわかりませんでした。 具体的には、たとえば、4枚のtif画像があったとして、それを1枚に結合して縮尺変えてpngで保存する。ということをやりたいと思っております。 [1][2] [3][4]  ↓ [合成] 画像を読み込んで幅高さ変更や減色をして保存するところはわかるのですが、連結部分がわかりません。 今のとこのサンプルを下記に書いておきます。 ------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); var dir: String; begin //ファイル読み込み dir := 'c:\tmp\imagekit\'; IkFile.FileName := dir + 'test.tif'; if IkFile.LoadFile(ikLoadTIFF) = False then Exit; IkCommon.ImgHandle := IkFile.ImgHandle; try if IkCommon.GetImageType() = False then Exit; //幅、高さ変更 IkEffect.InImgHandle := IkFile.ImgHandle; if IkEffect.Resize(100,50,false) = False then Exit; IkCommon.FreeMemory(); //変換前のメモリハンドルを解放 IkFile.ImgHandle := IkEffect.OutImgHandle; IkCommon.ImgHandle := IkFile.ImgHandle; //変換後のメモリハンドルを解放するために設定 //減色 IkEffect.InImgHandle := IkFile.ImgHandle; if IkEffect.ConvertColor(8, False, False, 0) = False then Exit; IkCommon.FreeMemory(); //変換前のメモリハンドルを解放 IkFile.ImgHandle := IkEffect.OutImgHandle; IkCommon.ImgHandle := IkFile.ImgHandle; //変換後のメモリハンドルを解放するために設定 //保存 IkFile.FileName := fn + 'test.png'; IkFile.SaveFile(ikSavePNG); finally IkCommon.FreeMemory(); IkFile.ImgHandle := 0; end; end; ------------------------------------------------------------ もしサンプル書いていただく際はDelphiじゃなくても、CでもVBでもなんでも結構です。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kashi1031
  • ベストアンサー率100% (2/2)
回答No.1

自己解決

pucyan
質問者

補足

自己解決しました。 IkEffect.Layer を使って画像をマージすることができました。 下記に解決内容を書いておきます。 ------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); var Trans: Smallint; Red1, Green1, Blue1: Smallint; Red2, Green2, Blue2: Smallint; x1, y1: Longint; Clip, Ret: WordBool; dir: String; imgW,imgH: Integer; imgHandle1,imgHandle2: Integer; begin // 貼り付け処理 Trans := 255; // 透かしの割合 Red1 := 0; // 透明色色指定(赤) Green1 := 0; // 透明色指定(緑) Blue1 := 0; // 透明色指定(青) Red2 := 255; // 無効領域の色指定(赤) Green2 := 255; // 無効領域の色指定(緑) Blue2 := 255; // 無効領域の色指定(青) Clip := False; // クリッピングの有無 //ファイル読み込み dir := 'c:\tmp\imagekit\'; IkFile.FileName := dir + 'test1.tif'; if IkFile.LoadFile(ikLoad) = False then Exit; IkCommon.ImgHandle := IkFile.ImgHandle; //元画像サイズ取得 IkCommon.GetImageType; imgW := IkCommon.ImgWidth; imgH := IkCommon.ImgHeight; //イメージハンドル保存 imgHandle1 := IkCommon.ImgHandle; //ファイル読み込み IkFile.FileName := dir + 'test2.tif'; if IkFile.LoadFile(ikLoad) = False then Exit; IkCommon.ImgHandle := IkFile.ImgHandle; //イメージハンドル保存 imgHandle2 := IkCommon.ImgHandle; //新しいイメージ作成 IkCommon.CreateImage(imgW*2, imgH, 8, Red1, Green1, Blue1); IkEffect.InImgHandle := IkCommon.ImgHandle; x1 := 0; y1 := 0; //イメージ合成 IkEffect.Layer(IkEffect.InImgHandle, imgHandle1, Trans, True, Red1, Green1, Blue1, Red2, Green2, Blue2, x1, y1, Clip); //合成前画像のメモリハンドルを解放 IkCommon.ImgHandle := IkEffect.InImgHandle; IkCommon.FreeMemory(); //読み込んだ画像のメモリハンドル解放 IkCommon.ImgHandle := imgHandle1; IkCommon.FreeMemory(); IkEffect.InImgHandle := IkEffect.OutImgHandle; x1 := imgW; y1 := 0; //イメージ合成 IkEffect.Layer(IkEffect.InImgHandle, imgHandle2, Trans, True, Red1, Green1, Blue1, Red2, Green2, Blue2, x1, y1, Clip); //合成前画像のメモリハンドルを解放 IkCommon.ImgHandle := IkEffect.InImgHandle; IkCommon.FreeMemory(); //読み込んだ画像のメモリハンドル解放 IkCommon.ImgHandle := imgHandle2; IkCommon.FreeMemory(); IkEffect.InImgHandle := IkEffect.OutImgHandle; //保存 IkFile.ImgHandle := IkEffect.OutImgHandle; IkFile.FileName := dir + 'test.png'; IkFile.SaveFile(ikSavePNG); //合成後画像のメモリハンドル解放 IkCommon.ImgHandle := IkEffect.OutImgHandle; IkCommon.FreeMemory(); IkFile.ImgHandle := 0; end; ------------------------------------------------------------

関連するQ&A

  • フォルダ内の全てのファイル開く時間短縮の方法

    Excelのマクロを使ってフォルダ内の全てのファイルを開く以下のコードを利用しているのですが(教えてgoo!で教えて頂いたコードです)、ファイル数が10個くらいあるため全部開くのに1分くらいかかってしまいます。 もっと時間を短縮することはできませんでしょうか? Sub OpenAllBook()   Dim FileName As String   Dim OpenedBook As Workbook   Dim IsBookOpen As Boolean   ChDir ("フォルダ名")   FileName = Dir("*.xls")   Do While FileName <> ""    If FileName <> ThisWorkbook.Name Then     IsBookOpen = False     For Each OpenedBook In Workbooks      If OpenedBook.Name = FileName Then       IsBookOpen = True       Exit For      End If     Next     If IsBookOpen = False Then      Workbooks.Open (FileName)     End If    End If    FileName = Dir()   Loop End Sub

  • Excelのブック間の串刺し計算について

    Excelのブック間の串刺し計算について VBA超初心者です。同じフォルダ内にファイルがいくつかあり、同じ形式で、sheet1のB4のセルに計があったとして、それをブック間で串刺し集計したいのですが、うまくいきません。どこが悪いのかもわからず、困り果ててます。ご指導お願いします。 Sub BookShuukei() Dim FileName As String Dim Total As Integer Dim OpenedBook As Workbook Dim IsBookOpen As Boolean FileName = Dir("*.xls") Application.ScreenUpdating = False Do While FileName <> "" If FileName <> ThisWorkbook.Name Then IsBookOpen = False For Each OpenedBook In Workbooks If OpenedBook.Name = FileName Then IsBookOpen = True Exit For End If Next If IsBookOpen = False Then Workbooks.Open (FileName) End If Total = Total + Workbooks(FileName).Sheets(1).Range("B4").Value If IsBookOpen = False Then Workbooks(FileName).Close End If End If FileName = Dir() Loop Application.ScreenUpdating = True MsgBox (Total) End Sub

  • vba で全てのエクセルファイルを開く処理

    お世話になります。 下記のVBAソースで、特定のフォルダにあるエクセルを全て 開く処理をしているのですが、スマートに行えているか 疑問に思いました。 具体的には、「'''''''''時間がかかっている??」箇所で 無駄なこと・時間がかかっていないか疑問です。 目的としては、「vba で全てのエクセルファイルを開く処理」ですので、 (1)皆さんがされている「vba で全てのエクセルファイルを開く処理」 (2)下記ソースの「'''''''''時間がかかっている??」は時間がかかっていないか の、どちらかで、結構ですのでご返事頂ければ有り難いです。 宜しくお願いします。 ------------ソース----------------- ChDir (ThisWorkbook.Path & "\" & フォルダ) fileName = Dir("*.xls") Do While fileName <> "" If fileName <> ThisWorkbook.Name Then IsBookOpen = False '''''''''時間がかかっている?? For Each OpenedBook In Workbooks If OpenedBook.Name = fileName Then IsBookOpen = True Exit For End If Next '''''''''時間がかかっている?? If IsBookOpen = False Then Workbooks.Open (fileName) End If End If fileName = Dir() Loop

  • 2010excel の記述方法

    2007excelでマクロを記述したものが、実行エラー1004 「Save As メリッドは失敗しました Workbookオブジェクト」と表示されます。 テバックすると NewWkbook.SaveAs FileName:=FileName, FileFormat:=xlExcel8 がエラー表示されます。 すいません、教えてください If Dir(FileName) <> "" Then '##ファイルが既に存在する If MsgBox("既に指定のファイルが存在します。 置き換えますか?", vbOKCancel, "置き換えの確認") = vbCancel Then NewWkbook.Close saveChanges:=False '##保存せずに終了 Exit Sub End If '##指定ファイル置き換え保存 NewWkbook.SaveAs FileName:=FileName, FileFormat:=xlExcel8 Else '##ファイルを新規保存 NewWkbook.SaveAs FileName:=FileName, FileFormat:=xlExcel8←黄色 End If ' NewWkbook.Close saveChanges:=False Application.DisplayAlerts = True

  • EXcelマクロで同じフォルダ内のファイル全て開く。ドライブまたいでも対応

    以前以下のVBAを教えていただいたham-kamoさんに質問があります。もちろん違う方でも構いません。 「同じフォルダ内のブックを開くマクロ」についてですが、以下のVBAだとカレントフォルダをオプションで違うドライブに設定しているとうまく動作しないのですが、解決法はありますでしょうか? 例えば\\AAAA\BBというアドレスのフォルダ内にマクロを起動するファイルがあり、C:\Documents and Settings\XXXXがカレントフォルダに設定されるとC:\Documents and Settings\XXXX内のExcelファイルが開かれてしまうということです。 -------------------------- Sub OpenAllBooks() Dim FileName As String Dim OpenedBook As Workbook Dim IsBookOpen As Boolean ChDir (ThisWorkbook.Path) FileName = Dir("*.xls") Do While FileName <> "" IsBookOpen = False For Each OpenedBook In Workbooks If OpenedBook.Name = FileName Then IsBookOpen = True Exit For End If Next If IsBookOpen = False Then Workbooks.Open (FileName) End If FileName = Dir() Loop End Sub

  • エクセル VBA シート保存ボタン

    Sheet上にボタンを作成 ボタンを押すと保存するようにしています! 以前ここでSheet2枚をコピー出来るような 記述教えてもらったのですが・・ 1枚ならどう変化して良いか・・ 記述を書きましたが 何処が違うか教えて下さい! Private Sub CommandButton1_Click()   Dim FileName  As String   Dim FileExt   As String   Dim BkName   As String   Dim OldWkbook  As Workbook   Dim NewWkbook  As Workbook   Const StName1  As String = "ko"      '   Application.DisplayAlerts = False   Set OldWkbook = ActiveWorkbook   '   'ファイル名を取得   BkName = OldWkbook.Sheets(StName1).Range("A1").Value   FileName = BkName & Format(Now, "yyyy-mm") & ".XLS"   '   FileName = InputBox(FileName & "と言う名前で保存します" & vbCr & "よろしければこのままOKをクリックしてください", "保存ファイル名の確認", FileName)   If FileName = "" Then     Exit Sub   Else     If Right(FileName, 4) <> ".XLS" Then       MsgBox "ファイル名が異常です。"       Exit Sub     End If   End If   '   OldWkbook.Sheets(Array(StName1)).Copy   Set NewWkbook = ActiveWorkbook   For wIx = 1 To NewWkbook.Sheets(1).Shapes.Count     NewWkbook.Sheets(1).Shapes(wIx).Delete    Next   NewWkbook.Sheets(1).Name = StName1   '   FileName = "D:\保存\計画\" & FileName   '   If Dir(FileName) <> "" Then     '##ファイルが既に存在する     If MsgBox("既に指定のファイルが存在します。 置き換えますか?", vbOKCancel, "置き換えの確認") = vbCancel Then       NewWkbook.Close savechanges:=False       '##保存せずに終了       Exit Sub     End If     '##指定ファイル置き換え保存     NewWkbook.SaveAs FileName:=FileName   Else     '##ファイルを新規保存     NewWkbook.SaveAs FileName:=FileName   End If   '   NewWkbook.Close savechanges:=False   Application.DisplayAlerts = True End Sub 教えて下さい!

  • VBA フォルダ内の複数Excelファイルを開く

    お世話になります。 XP エクセル2003使用です。 フォルダー内にある複数のすべてのエクセルを開くコードを 下記の解答をそのままコピーして実行しました。 (以下、このエクセルファイルを「実行ファイル.xls」と呼びます) http://okwave.jp/qa/q2598781.html (コードは最後尾に転記(※)) 問題点は、実行ファイル.xlsから実行した 開きたいエクセルファイルは、 Workbook_Open()で自動実行して、 最後に、ThisWorkbook.Closeで閉じるので、 マクロの実行がループの途中(1回目)で 実行ファイル.xls のコードの実行も終了してしますことです。 (実行ファイル.xls のファイルは開いたままです) つまり、ThisWorkbook.Closeでエクセルを閉じたときに マクロの実行までもが終わってしまうので、 実行ファイル.xlsに戻ってきません。 この問題を解決するための方法として 下記2点を調べましたが、力不足で自己解決できません。 --------------------- 1  実行ファイル.xls から開きたいエクセルファイルを開く時に 何かしらの命令文または引数を記述しておく。  → 解決のヒントを見つけることができませんでした。 --------------------- 2 実行ファイルをエクセルではなく、VBS(VBScript)で記述する。 この場合、参考にしたコードを、 VBS用に書き換えれば良いと思いますが、 VBSは記述したことがないので、さっぱりです。 方法として間違っていなければ、 できれば、どなた様か当該コードを VBS用で記述いただけませんでしょうか? --------------------- 一番良い方法が分からないので、 お力添えいただきたいのです。 よろしくお願いします。 --------------------- (※)参考コード --------------------- Sub OpenAllBooks()   Dim FileName As String   Dim OpenedBook As Workbook   Dim IsBookOpen As Boolean      FileName = Dir("*.xls")   Do While FileName <> ""     If FileName <> ThisWorkbook.Name Then       IsBookOpen = False       For Each OpenedBook In Workbooks         If OpenedBook.Name = FileName Then           IsBookOpen = True           Exit For         End If       Next       If IsBookOpen = False Then         Workbooks.Open (FileName)  ←この処理の後に戻ってこれません       End If     End If     FileName = Dir()   Loop End Sub

  • ブックの集計方法について

    複数ファイルにある特定のシートのA列に記載がある時だけ、その行のA列からJ列までを、一つのファイルにコピーしたいと思っています。 ネットで調べてみたところ、エクセルで複数ファイルにある特定のシートの 特定した範囲を一つのファイルにコピーするマクロを探すことができました。 複数のシートから特定のシートのA列に文字がある場合は、J列までを一つのファイルの同じシートにコピーするようなことは出来ないでしょうか? (例えば、各ブックA列に10行ずつ文字がある場合は、このようなとりまとめをできないかと考えています。) ブック1(シート名:Q2)⇒集計シートのA1:J10 ブック2(シート名:Q2)⇒集計シートのA11:J20 ブック3(シート名:Q2)⇒集計シートのA21:J30 Sub ブック集合() Dim FileName As String Dim c As Integer Dim OpenedBook As Workbook Dim IsBookOpen As Boolean ChDir "c:/test" FileName = Dir("*.xls") Application.ScreenUpdating = False Application.DisplayAlerts = False c = 0 Do While FileName <> "" If FileName <> ThisWorkbook.Name Then IsBookOpen = False For Each OpenedBook In Workbooks If OpenedBook.Name = FileName Then IsBookOpen = True Exit For End If Next If IsBookOpen = False Then Workbooks.Open (FileName) End If Workbooks(FileName).Sheets("Q2").Range("A1:J500 ").Copy _ ThisWorkbook.Sheets(3).Cells(c * 500 + 1, 1).PasteSpecial(xlPasteValues) c = c + 1 If IsBookOpen = False Then Workbooks(FileName).Close End If End If FileName = Dir() Loop Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub

  • フォルダ内のファイル名取得の仕方が分かりません

    Apache2.0.47、PHP4.3.2で使用しています。 フォルダ内のファイル名の取得を以下のように書いています。 (scandirは使えませんでした) <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } sort($files); print_r($files); ?> "."と".."も取得されるので、以下のように変更したのですが同じ結果でした。 <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { if(filename!=". "){ if(filename!=".. "){ $file[] = $filename; } } } sort($files); print_r($files); ?> "."と".."をはぶいたファイル名だけを取得したい場合にはどうすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • cshの条件式について教えてください

    cshで該当ディレクトリにファイルがなければOK、あればエラーというような処理をしようと思っています。 しかし、下記のような記述ではうまくできません。 1) *************************** if ( -e $DIR/*.* ) then echo "NG" exit 1 else echo "OK" endif exit 0 *************************** if文でなく、外にだせばうまくいくのですが... 2) *************************** test -e $DIR/*.* if($status == 0) then echo "NG" exit 1 else echo "OK" endif exit 0 **************************** if ( test -e $DIR/*.* ) then... でもだめでした。 どうにかしてif文で一発判定をしたいと思っているのですが、正しい記述方法を教えてください。 よろしくお願いします。

専門家に質問してみよう