ニュートン メニュー

株式会社ニュートン

マイクロソフトパートナー

YouTube公式チャンネル

体験版ダウンロード

製品案内

ライセンスパック

ライセンスについて

カスタマイズ受付

製品購入ガイド

オンラインショップ
直販ショップ !
ニュートンストアで購入
コンポーネントソース
コンポーネントソースで購入

優待販売・
 キャンペーン情報

ユーザサービス
〔サポートページ〕

サポート体制

お知らせ
・ニュースリリース
・懐かCM
・イベント出展
・製品関連記事

会社概要

個人情報保護方針

お問い合わせ先

 

ニュートンホーム Q&A
以前のImageKit シリーズ

Windowsイメージ処理プログラムキット
以前のImageKitシリーズ

このページは、以前のImageKitシリーズのユーザ様より寄せられたご質問の一部とその回答を掲載しております。


「回答」中の( )内の凡例:
ImageKit4→4
ImageKit/OCX版→OCX
ImageKit/DLL版→DLL
ImageKit for Borland→Bo
ImageKit for Visual dBASE→Vd
ImageKit4 Borland Edition→BE4


【以前のImageKitシリーズQ&A一覧】

QNo.

Q.質問

A.回答

16

Q.Delphi4でディスプレイコントロールのマウス関連のイベントが取得できないのですが?
A.以下の作業を行ってください。
Delphi4のアップデートモジュール(インプライズさんのHPもしくは雑誌の付録のCD-ROM)でUpdatePack2以上にしてください。(更新するとDelphi4のバージョン情報に表示されます。)

15

Q.C++Builder3で作成したプロジェクトをC++Builder4で再構築するとエラーがでるのですが?
A.以下の作業を行ってください。
  1)ヘッダファイルから、以下の記述のある行を削除します。
    #include "IMGKITLib_TLB.h"
    #include "ImgSldLib_TLB.h"
  2)ソースファイルから以下の記述のある行を削除します。
    #pragma link "IMGKITLib_TLB"
    #pragma link "ImgSldLib_TLB"

また、C++Builder3でImageKitのクラス名を"・・・Proxy"とした場合には、プログラム中でクラス名を変更するか、もしくはC++Builder4の「コンポーネント」-「ActiveXコントロールの取込み」でクラス名を同じにする必要があります。

14

Q.DelphiやC++Builder、もしくはWindowsNT4.0でクリップボードを利用して、イメージをImageKit4に渡して処理しようとしているのですが上手くいきません。どのようにすればよいのでしょうか?
A.以下の作業を行ってください。
  1)1998/11/30以降の修正版をダウンロードします。
  2)クリップボードから取得したイメージを24ビットカラーに変換します。
  3)該当する処理を行います。
13 Q.VC4、VC5、VC6 + MFCでの利用で「印刷」及び「印刷プレビュー」を正しく印刷・表示するには?
A.以下の作業を行ってください。
  1)1998/10/22以降の修正版をダウンロードします。
  2)OnPrint()関数で下記の様にプログラムしてください。
    void CImgDemoView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
      CImgDemoDoc* pDoc = GetDocument();

      RECT Rect;

      //テキストを併用して印刷する場合は、イメージを印刷する前にテキストを印刷すること
      Rect.left = 100;
      Rect.top = 100;
      Rect.right = 600;
      Rect.bottom = 600;
      pDC->DrawText ("Text1", &Rect, DT_CENTER);

      // Image 1
      Rect.left = 100; // 0.1mm単位で印刷範囲を指定
      Rect.top = 100;
      Rect.right = 600;
      Rect.bottom = 600;
      ImgKitPrint((HWND)&pInfo->m_pPD->m_pd, pDC->m_hDC, ImageHandle1, (LPRECT)&Rect, TRUE);

      //イメージを2枚以上印刷(プレビュー)する場合は、ImgKitPrintの一番目の引数に0を与えること
      // Image 2
      Rect.left = 1000; // 0.1mm単位で印刷範囲を指定
      Rect.top = 1000;
      Rect.right = 1500;
      Rect.bottom = 1500;
      ImgKitPrint(0, pDC->m_hDC, ImageHandle2, (LPRECT)&Rect, TRUE);
    }

12

Q.ImageKit4を利用して、VBのピクチャーボックスとデータをやり取りするには?

A.クリップボードを利用します。
以下にVBでImageKit4を利用する場合のコード例を示します。

'DLLを使用した例
Private Sub Foo(ByVal FileNm As String)
    Dim Ret As Boolean
    Dim Handle As Long

    Handle = ImgKitFileLoad(FileNm, "", "")
    'ImageKitからクリップボードへデータ転送
    Ret = ImgKitSetToClipBrd(Form1.hWnd, Handle)
    ImgKitMemFree (Handle)

    'クリップボードからピクチャーボックスへデータ取得
    Picture1 = Clipboard.GetData(vbCFDIB)
    '様々な処理
          ・
          ・
          ・

    'ピクチャーボックスからクリップボードへデータ転送
    Clipboard.Clear
    Clipboard.SetData Picture1, vbCFBitmap

    'クリップボードからImageKitへデータ取得
    Handle = ImgKitGetFromClipBrd(Form1.hWnd)
    '様々な処理
          ・
          ・
          ・
    ImgKitMemFree (Handle)
End Sub

'OCXを使用した例
Private Sub Foo(ByVal FileNm As String)

    ImgKitFile1.FileName = FileNm
    ImgKitFile1.Action = 0
    ImgKitFile1.Execute

    'ImageKitからクリップボードへデータ転送
    ImgKitEffect1.Handle = ImgKitFile1.Handle
    ImgKitEffect1.Action = 12
    ImgKitEffect1.Execute

    ImgKitFile1.FreeMemory

    'クリップボードからピクチャーボックスへデータ取得
    Picture1 = Clipboard.GetData(vbCFDIB)
    '様々な処理
          ・
          ・
          ・

    'ピクチャーボックスからクリップボードへデータ転送
    Clipboard.Clear
    Clipboard.SetData Picture1, vbCFBitmap

    'クリップボードからImageKitへデータ取得
    ImgKitEffect1.Action = 13
    ImgKitEffect1.Execute
    '様々な処理
          ・
          ・
          ・
    ImgKitEffect1.FreeMemory
End Sub

11

Q.C++Builder3のTBitmapにImageKitで読込んだ画像を設定するには?
A.フォームにTButton、TImage、TImgKitFile、TOpenDialogを貼り、ButtonのNameプロパティをButton2に設定して以下のソースを組込んでください。
Unit1.cpp
Unit1.h

10

Q.C++Builder3でC++Builder用の付属のサンプルを実行するには?
A.以下の作業を行ってください。
  1)「コンポーネント」-「ActiveXコントロールの取込み...」を実行します。
    この時、クラス名の最後に"Proxy"と言う文字列がついていますので、この
    文字列を削除して、「インストール」ボタンをクリックします。
  2)ヘッダファイルから、以下の記述のある行を削除します。
    #include "IMGKIT32.hpp"
    #include "IMGK4_32.hpp"
  3)ソースファイルから以下の記述のある行を削除します。
    #pragma link "IMGKIT32"
    #pragma link "IMGK4_32"

なお、新規にプロジェクトを作成する場合には、ActiveXコントロールの取込みのみを行ってください。(この時、"Proxy"と言う文字列があっても構いません。)

9

Q.ディスプレイコントロールに表示した画像に文字、線等を描画するには?
A.ディスプレィコントロールのWndHandleプロパティからデバイスコンテキストを作成し、作成したデバイスコンテキストに対してGDI関数を使用する事により実現します。
以下にVBでImageKitのOCXコントロールを利用する場合の32ビット用コード例を示します。

'外部プロシージャへの参照を宣言

Type POINTAPI
x As Long
y As Long
End Type

Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long

Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long

Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Declare Function MoveToEx Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long


'ディスプレィコントロールに文字、線を描画
Private Sub Foo()
    Dim phdc As Long
    Dim lpPoint As POINTAPI

    'ディスプレィコントロールのデバイスコンテキストを取得
    phdc = GetDC(ImgKitDisp1.WndHandle)

    '文字の描画
    TextOut(phdc, 100, 100, "This is Text", 12)

    '線の描画
    MoveToEx(phdc, 0, 0, lpPoint)
    LineTo(phdc, 200, 200)

    '取得したデバイスコンテキストの解放
    ReleaseDC(ImgKitDisplay1.WndHandle, phdc)
End Sub
8

Q.ImageKitを利用しての、イメージの印刷でプリンタダイアログを表示させない方法は?

A.プリンタのデバイスコンテキストを作成するWindowsAPIを利用するコードを記述します。
以下にVBでImageKitのOCXコントロールを利用する場合の32ビット用コード例を示します。

'外部プロシージャへの参照を宣言
' size of a device name string
Public Const CCHDEVICENAME = 32

' size of a form name string
Public Const CCHFORMNAME = 32

Type DEVMODE
 dmDeviceName As String * CCHDEVICENAME
 dmSpecVersion As Integer
     ・
     ・
     ・
 dmDisplayFlags As Long
 dmDisplayFrequency As Long
End Type

Public Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As DEVMODE) As Long

Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

'印刷処理
Private Sub Foo()
    Dim phdc As Long
    Dim devm As DEVMODE

    devm.dmSize = LenB(devm)

    '現在選択されているプリンタデバイスコンテキストの作成
    phdc = CreateDC("WINSPOOL", Printer.DeviceName, "", devm)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    '印刷開始
    ImgKitPrint1.PrintHDC = phdc 'プリンタのデバイスコンテキストをセット
    ImgKitPrint1.Handle = ・・・・
    ImgKitPrint1.PrintMessage = ・・・・
    ImgKitPrint1.Action = 0
    ImgKitPrint1.Execute

    '印刷
    ImgKitPrint1.PrintLeft = ・・・・
    ImgKitPrint1.PrintTop = ・・・・
    ImgKitPrint1.PrintRight = ・・・・
    ImgKitPrint1.PrintBottom = ・・・・
    ImgKitPrint1.Action = 1
    ImgKitPrint1.Execute

    '印刷の終了(用紙の排出)
    ImgKitPrint1.Action = 2
    ImgKitPrint1.Execute

    '作成したプリンタデバイスコンテキストの削除
    DeleteDC(phdc)
    ^^^^^^^^^^^^^^
End Sub

7

Q.ImageKitを利用して作成したアプリケーションの配布に必要なファイルは何か?

A.以下のファイルが必要です。
なお、下記の「ImageKit以外のファイル」は、VBの「セットアップウィザード」を使用する場合などのように、自動的に配布ファイルに含まれるものもあります。
また、「.OCX」ファイルは、DLLコマンドとしてのみImageKitをご利用の場合、ImageKit/DLL版をご利用の場合は不要です。
32ビットアプリケーションの場合 16ビットアプリケーションの場合
ImageKit関連ファイル
IMGKIT32.OCX IMGKIT16.OCX
IMGK4_32.OCX(4、BE4のみ) IMGK4_16.OCX(4のみ)
IMGCOM3.DLL IMGCOM.DLL
IMGCUT3.DLL IMGCUT.DLL
IMGDSP3.DLL IMGDSP.DLL
IMGETC3.DLL IMGETC.DLL
IMGFILE3.DLL IMGFILE.DLL
IMGSCAN3.DLL IMGSCAN.DLL
IMGTIFF3.DLL(4、BE4のみ) IMGTIFF.DLL(4、Vd、BE4のみ)
IMGDBAS3.DLL(BE4のみ) IMGDBASE.DLL(Vd、BE4のみ)
ImageKit以外のファイル
OLEPRO32.DLL OC25.DLL
MSVCRT40.DLL  
MFC40.DLL  

6

Q1.TWAIN対応スキャナをImageKitで利用したところ、データソースの選択ダイアログにそのスキャナのデータソースが表示されないのはなぜか?
Q2.TWAIN対応デジタルカメラをImageKitで利用したいが、作成するアプリケーションが16ビット用で、そのデジタルカメラには32ビット用のTWAINドライバしか付属していないのだが、どうすればそのデジタルカメラが使えるか?

A.TWAIN対応のスキャンデバイス(スキャナ、デジタルカメラ、フィルムスキャナなど)をWindowsで使用する場合、実行するアプリケーションが16ビット用か、32ビット用かにより必要なTWAINドライバなどが異なります。
32ビット用アプリケーションには、32ビット用のTWAINドライバが、16ビット用アプリケーションには、16ビット用のTWAINドライバが、それぞれ必要になります。

上記のQ1.の場合は、たとえばインストールしてあるTWAINドライバが32ビット用であり、16ビット用アプリケーションをWindows95で実行している場合などが考えられます。その場合は、16ビット用のTWAINドライバをインストールする方法が最も簡単です。しかし、全てのメーカのTWAIN対応のスキャンデバイスに32ビット、16ビットの両方のTWAINドライバが同梱されているとは限りません。同梱されていなくても、そのメーカのホームページやステーション、フォーラムなどでダウンロードできる場合もあります。

しかし、メーカがそのスキャンデバイスには、32ビット、16ビットどちらかのTWAINドライバしか、もともと提供していない場合があります。
そういう場合に、使用するのがTWAINドライバの32ビット、16ビット相互コンバータのようなもので、「TWUNK_32.EXE」、「TWUNK_16.EXE」というファイルです。
これらは、拡張子は「EXE」ですがDLLのようなものと考えてください。
動作環境の\WindowsディレクトリにコピーすればOKで、自分でプログラムを作成したりする必要は何もありません。
これらは、公的には「TWAINワーキンググループ」というところから提供されています。
スキャンデバイスのメーカが用意している場合もありますので、必要な方はメーカへ問い合わせてください。
これらの用途は次の通りです。

 TWUNK_32.EXE→16ビットアプリから32ビット用TWAINドライバを使う場合
 TWUNK_16.EXE→32ビットアプリから16ビット用TWAINドライバを使う場合

5 Q1.ImageKit4、ImageKit/OCX版のOCXコントロールを利用してAccessの「レポート」でイメージを印刷する方法はどうするか?
Q2.Access2.0(16ビット)でImageKit4、ImageKit/OCX版のOCXコントロールのプロパティなどの記述しているコードで、コンパイルエラーがでるのだが?
A1.Accessの「レポート」を使ってイメージを印刷する手順は、次の通りです。

1.「フォーム」に配置した印刷ボタンのClickイベントなどに、OpenReportメソッドを記述します。
2.「レポート」上の「詳細」セクションにImageKitのディスプレイコントロールを配置します。
3.「レポート」上に配置したディスプレイコントロールを使って、イメージの表示を行うコードを記述します。
コードを記述する箇所は、「詳細」セクションのFormatイベントなどです。
その際、ディスプレイコントロールのHandleプロパティには、印刷するイメージを示すハンドルをセットします。

以下に、そのコード例を示します。

'---------------------------
'Form_f1モジュール
'---------------------------
 Private Sub cmdPrint_Click()

 DoCmd.OpenReport "r1",acNormal '即時印刷
 'DoCmd.OpenReport "r1",acPreview 'プレビュー印刷

End Sub

'---------------------------
'Report_r1モジュール
'---------------------------
Private Sub 詳細_Format(Cancel As Integer,FormatCount As Integer)

 Reports!r1!ImgKitDisp1.Handle=Forms!f1!ImgKitFile1.Handle
 Reports!r1!ImgKitDisp1.Action=0
 Reports!r1!ImgKitDisp1.Execute

End Sub

A2.Access2.0(16ビット)でのImageKitの各コントロールのプロパティやメソッドのコード記述方法について

@Access2.0では、ImageKitのようなカスタムOCXを利用するには、非連結オブジェクトフレームのOLEオブジェクトを使います。
その場合、コードの記述においてAccessBasicの関数やメソッドと同じ名前のものを実行する場合は、名前の前後に[ ]をつける必要があるため、ImageKitのコントロールのプロパティやメソッドを[ ]で囲みます。

A更に、非連結オブジェクトフレームのOLEオブジェクトを表すAccessのObjectプロパティをImageKitのコントロール名とそのプロパティやメソッドの間に記述します。

  以下にそのコード例を示します。

Function BmpLoadDisp()

 Forms!f1!ImgKitFile1.Object.[FileName]="smp001.bmp"
 Forms!f1!ImgKitFile1.Object.[Action]=0
 Forms!f1!ImgKitFile1.Object.[Execute]

 Forms!f1!ImgKitDisp1.Object.[Handle]=Forms!f1!ImgKitFile1.Object.[Handle]
 Forms!f1!ImgKitDisp1.Object.[Action]=0
 Forms!f1!ImgKitDisp1.Object.[Execute]

End Function

4 Q.ImageKit4のOCXコントロールを利用して、オペレータが指定した範囲のイメージの部分ズームを実現するには、どうしたらよいか?
A.基本的な手順は、ディスプレイコントロールのRectDrawプロパティを利用してマウス操作を起動した後、オペレータが操作したイメージ上の任意の矩形範囲4点をRectBottom、RectLeft、RectRight、RectTop各プロパティより取得して、エフェクトコントロールの「イメージの矩形切り取り」実行後、切り取ったイメージを別のディスプレイコントロールに表示します。

オペレータのイメージの範囲選択操作が処理に入るため、文章では複雑に見えますが、ImageKit4のサンプルプログラム(VB用、Delphi用)にその機能が使われていますので、それでオペレータの操作を確認してから、関連するイベントなどのコードを参考にプログラミングしてください。

以下に、サンプルプログラムにおけるイメージの部分ズームのオペレータの操作方法を示します。

@サンプルプログラムを実行します。
Aメインフォームの「LOAD」ボタンや「スキャナ取込」ボタンなどで、イメージを表示します。
B表示されたイメージ上で、マウスのドラッグで、任意の矩形範囲を選択します。
Cマウスの右ボタンを押すと、Bで選択されたイメージ範囲だけが別のウィンドウに表示されます。
※選択したイメージ範囲をクリアするには、イメージ上でマウスのダブルクリックを行います。

3 Q.ImageKitを利用した印刷で、イメージとテキスト(文字列)の混在印刷を実現するにはどうするか?
A.ImageKitの印刷機能そのものでは、イメージのみの印刷となりますが、Windowsの標準APIのコールを加えることで、イメージとテキストの混在印刷が可能となります。

使用するWindowsAPIは、TextOutA(32ビット用)やTextOut(16ビット用)です。

たとえば、VBの場合

#If Win32 Then
 Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hDC As Long, ByVal nXStart As Long, ByVal nYStart As Long, ByVal lpString As String, ByVal cbString As Long) As Boolean
#Else
 Public Declare Function TextOut Lib "gdi" (ByVal hDC As Integer, ByVal nXStart As Integer, ByVal nYStart As Integer, ByVal lpString As String, ByVal cbString As Integer) As Boolean
#End If
のように外部プロシージャへの参照を宣言し、ImageKitのプリントコントロールのActionプロパティに2をセット(印刷の終了)する前に、以下のようなコードを記述します。

 ' 用紙の上端中央に文字列を出力
 Printer.ScaleMode = 3 ' ピクセル
 ret = TextOut(Printer.hDC, Int((Printer.ScaleWidth - Printer.TextWidth("画像データ"))) / 2, 0, "画像データ", 10)
 Printer.ScaleMode = 1 ' 標準

このTextOutの場合の引数は5つで、順番に、@プリンタオブジェクトのhDC(デバイスコンテキスト)、A左上の水平方向の印刷開始位置(ピクセル単位)、B左上の垂直方向の印刷開始位置(ピクセル単位)、C印字したい文字列、D印字したい文字列の長さ(バイト単位)です。

2 Q.ImageKitでDelphiのビットマップオブジェクトとのイメージのやりとりを行いたいが、どうすればよいか?
A.以下にサンプルコードを示します。

{ImageKitで読み込んだイメージをDelphiのビットマップオブジェクトへコピー}

proceduer foo;
var
 Bitmap: TBitmap;
 ImgInfo: IMAGE_INFO;
begin
 {読み込んだイメージの情報を取得}
 ImgKitImageInfo(ImgKitFile1.Handle, ImgInfo);

 {Bitmapを作成後サイズを読み込んだイメージのサイズに設定}
 Bitmap := TBitmap.Create;
 Bitmap.Height := ImgInfo.Height;
 Bitmap.Width := ImgInfo.Width;

 {作成したBitmapのHDCに対して読み込んだイメージのデータをコピー}
 ImgKitDisplayHdc(Bitmap.Canvas.Handle, ImgKitFile1.Handle, ImgInfo.Width, ImgInfo.Height, False);
    ・
    ・
    ・
 {Bitmapを使った処理}
    ・
    ・
    ・
 Bitmap.Free;
end;

{Delphiのビットマップオブジェクトからイメージを取得}

proceduer bar;
var
 lpbi: Pointer;
 hDIB: THANDLE;
 Infosize: Integer; {Delphi4.0はDWORD}
 ImageSize: DWORD;
begin
 GetDIBSizes(Bitmap.Handle, InfoSize, ImageSize);
 hDIB := GlobalAlloc(GHND, InfoSize + ImageSize);
 if hDIB = 0 then Exit;
 lpbi := GlobalLock(hDIB);
 GetDIB(Bitmap.Handle, Bitmap.Palette, lpbi^, (PChar(lpbi) + InfoSize)^);
 GlobalUnlock(hDIB);

 {DLL}
 ImgKitBmpFileSave('aa.bmp', hDIB, ' ', ' ', False);
 hDIB := ImgKitRotation(hDIB, ' ', ' ', ROTATE_L90);
 ImgKitBmpFileSave('bb.bmp', hDIB, ' ', ' ', False);

 {OCX}
 ImgEffect1.Handle := hDIB;
    ・
    ・
    ・
 {エフェクト処理}
    ・
    ・
    ・
 GlobalFree(hDIB);
end;

1 Q.ImageKitで使用するビットマップイメージを直接プログラムで利用する方法があるか?
A.あります。
ImageKitのOCXコントロールでのHandleプロパティ(または、DLLコマンドでの戻り値がHandleのもの)の保持する内容は、デバイス独立ビットマップ(DIB)へのポインタのハンドルです。
HandleプロパティをWindowsAPIのGlobalLock関数の引数にした戻り値が、DIBへのポインタとなります。

デバイス独立ビットマップ(DIB)の形式を以下に示します。

BITMAPINFOHEADER RGBQUADカラー ピクセルデータ
ヘッダ データ

↑GlobalLock関数の戻り値


詳細は、各関連マニュアル、書籍などをご覧ください。

Copyright (C) NEWTONE Corporation. All rights reserved.