ニュートン メニュー

株式会社ニュートン

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

YouTube公式チャンネル

体験版ダウンロード

製品案内

ライセンスパック

ライセンスについて

カスタマイズ受付

製品購入ガイド

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

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

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

サポート体制

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

会社概要

個人情報保護方針

お問い合わせ先

ニュートンホーム Q&A
ImageKit8 VCL

イメージ処理コンポーネント
ImageKit®8 VCL

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


【ImageKit8 VCL Q&A 一覧】

QNo.

Q.質問

日付
A.回答
36

Q. C++Builder XE6やDelphi XE6には対応していますか?

2014/07/29

A.申し訳ございませんが、対応しておりません。C++Builder XE6やDelphi XE6に対応した「ImageKit9 VCL」をご検討ください。

35

Q. 開発環境または運用環境において作成したアプリケーションの起動時にエラーが発生して正しく動作しません。どうすればよいですか?

2012/11/07

A.開発環境または運用環境に必要な BPL や DLL ファイルをインストールしても正しく動作しない場合は、「Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ」をインストールしてください(Microsoft Visual C++ 2008 を使用して DLL を作成しているため)。「Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ」には (x86),(x64) の2種類ありますので用途に応じて選択してください。
※「Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ」は Microsoft 社のオフィシャルサイトからダウンロードすることができます。

34

Q. TIFFのJPEG形式で読込できないファイルと読込できるファイルの違いは何ですか?

2012/11/07

A. Compressionタグが6(古い形式)の場合は読込できませんが、Compressionタグが7(新しい形式)の場合は読込可能です。
http://www.weblio.jp/content/Tagged+Image+File+FormatJPEG圧縮に簡単な説明がありますのでご覧ください。

33

Q. 画像を左右反転もしくは上下反転するにはどうすればよいですか?

2012/11/07

A. Effect.Rotationメソッド(DLLはIKRotationEx関数)を使用します。引数のAngleを0にし、TurnX をtrueにすると左右反転、TurnYをtrueにすると上下反転になります。TurnX,TurnYを両方trueにすると上下左右反転となります。

32

Q. 画像のメモリハンドルに対して複数の図形やテキストを描画すると処理に時間がかかります。時間を短縮するにはどうすればよいですか?

2012/11/07

A. 1つの画像に複数の図形やテキストを描画する場合は、PrintDrawのメソッドでメモリハンドルに描画するのではなく、ImageHdcプロパティを使用(編集状態にする)して、そちらに描画してください。 また、確定する際にはEdit.Modifyメソッドを実行してください。
DLLをお使いの場合は編集機能がないため、処理時間を短縮する方法はありません。

31

Q. ビット数が8以下(白黒2値、16色、256色)の画像のメモリハンドルに図形やテキストを描画したいのですが、指定できる色に制限はありますか?

2012/11/07

A. 使用するパレットの色で描画する必要があります。 画像の使用パレット色はGetPaletteFromImageメソッド(DLLはIKGetPalette関数)で取得できます。

30

Q. 開発者作成UIを使用してスキャナから用紙の複数の領域を読み取るにはどうすればよいですか?

2012/11/07

A. 一回のスキャンでは複数の領域を読み取ることができないため、複数回スキャンを実行してください。

例: 原稿台の用紙を連続でスキャンする
C++Builder
 if (VImageKit1->Scan->Initialize(1, 0, "1.00", "NEWTONE Corp. ", "ImageKit", "ImageKit8 Scan Sample") == false) return;
 VImageKit1->Scan->ClearProperty();
 VImageKit1->Scan->DataSourceName = "xxxxxxx"; //データソースの名称
 if (VImageKit1->Scan->OpenDataSource() == false)
 {
  VImageKit1->Scan->Terminate();
  return;
 }

 VImageKit1->Scan->TransferMode = vikScanMemory;
 VImageKit1->Scan->Compression = vikScanNoCompress;
 VImageKit1->Scan->UiMode = vikScanNONUI;
 VImageKit1->Scan->ScanMode = vikScanDOC;
 VImageKit1->Scan->UnitMode = vikScanInch;
 VImageKit1->Scan->PaperSize = 0; //あるいは負の値

 //1箇所目
 //読み取り領域を設定
 VImageKit1->Scan->RectLeft = 0;
 VImageKit1->Scan->RectTop = 0;
 VImageKit1->Scan->RectRight = 1;
 VImageKit1->Scan->RectBottom = 1;
 //他に必要な項目を設定
 VImageKit1->Scan->Execute();

 //2箇所目
 //読み取り領域を設定
 VImageKit1->Scan->RectLeft = 3;
 VImageKit1->Scan->RectTop = 3;
 VImageKit1->Scan->RectRight = 4;
 VImageKit1->Scan->RectBottom = 4;
 //他に必要な項目を設定
 VImageKit1->Scan->Execute();

 VImageKit1->Scan->CloseDataSource();
 VImageKit1->Scan->Terminate();
Delphi
 if VImageKit1.Scan.Initialize(1, 0, '1.00', 'NEWTONE Corp. ', 'ImageKit', 'ImageKit8 Scan Sample') = False then Exit;
 VImageKit1.Scan.ClearProperty;
 VImageKit1.Scan.DataSourceName := 'xxxxxxx'; //データソースの名称
 if VImageKit1.Scan.OpenDataSource = False then
 begin
  VImageKit1.Scan.Terminate;
  Exit;
 end;

 VImageKit1.Scan.TransferMode := vikScanMemory;
 VImageKit1.Scan.Compression := vikScanNoCompress;
 VImageKit1.Scan.UiMode := vikScanNONUI;
 VImageKit1.Scan.ScanMode := vikScanDOC;
 VImageKit1.Scan.UnitMode := vikScanInch;
 VImageKit1.Scan.PaperSize := 0; //あるいは負の値

 //1箇所目
 //読み取り領域を設定
 VImageKit1.Scan.RectLeft := 0;
 VImageKit1.Scan.RectTop := 0;
 VImageKit1.Scan.RectRight := 1;
 VImageKit1.Scan.RectBottom := 1;
 //他に必要な項目を設定
 VImageKit1.Scan.Execute;

 //2箇所目
 //読み取り領域を設定
 VImageKit1.Scan.RectLeft := 3;
 VImageKit1.Scan.RectTop := 3;
 VImageKit1.Scan.RectRight := 4;
 VImageKit1.Scan.RectBottom := 4;
 //他に必要な項目を設定
 VImageKit1.Scan.Execute;

 VImageKit1.Scan.CloseDataSource;
 VImageKit1.Scan.Terminate;

AfterScanイベントにもコードを記述してください(DLLはユーザ関数)。QNo.26も参照してください。
ADFの場合、同一用紙を連続でスキャンすることができませんので、再度用紙をADFに置いてからスキャンを実行してください。

29

Q. 開発者作成UIを使用してスキャナの用紙の自動検知機能を使用したいのですが、どうすればよいですか?

2012/11/07

A. データソースが用紙の自動検知機能(未定義サイズ)をサポートしているのか確認してください。VCLであればIsCapSupportedメソッド、DLLであればIKIsCapSupported関数で確認できます。
データソースが機能をサポートしている場合は、PaperSizeに1000を設定するだけではなくBorderDetectionにtrue(DLLは0以外)を設定してお試しください。データソースによってはBorderDetectionの値に関係なく動作するものもあります。

28

Q. Layerプロパティに4ビットカラー(16色)のイメージを設定して透過表示を行いたいのですが、上手くいきません。どうすればよいですか?

2012/11/07

A. 色数が少ないためパレットによっては透過表示が有効にならない場合があります。ConvertColorを使用して8ビットカラーに増色してお試しください。

27

Q. 文字間(CharExtra>0)を設定してDrawTextメソッド(DLLはIKDrawtext関数)を実行すると、文字が重なることがあります。どうすればよいですか?

2012/11/07

A. DrawTextの代わりにTextOutメソッド(DLLはIKTextOut関数)をご利用ください。

26

Q. 開発者作成UIを使用してスキャナから用紙の一部を読み取るにはどうすればよいですか?

2012/11/07

A.
(1)データソースが定型サイズをサポートしている場合
読み取り領域を設定し、PaperSizeに0もしくは負の値(用紙がA4なら-1)を設定してください。DLLをお使いの場合は、負の値を型キャストして設定してください。
(2)データソースが定型サイズをサポートしていない場合
読み取り領域を設定し、PaperSizeに0を設定してください。

詳しくはヘルプやPDFリファレンスのPaperSizeの解説をご覧ください。データソースがサポートしている用紙サイズはVCLであればGetCapEnumToFloat,ScanGetCapEnumメソッド、DLLであればIKScanGetCapEnum関数で取得できます。

25

Q. SVGの圧縮形式に対応していますか?

2012/11/07

A. 対応しておりません。

24

Q. マルチTiffファイルから特定のページを削除したいのですが、どうすればよいですか?

2012/11/07

A. 指定したページを削除する機能はありませんので、テンポラリファイルを作成し必要なページを順々に保存していきます。

例: 3ページ目を削除する
C++Builder
 int i, SaveType;
#ifdef _DELPHI_STRING_UNICODE
 UnicodeString AppPath;
#else
 AnsiString AppPath;
#endif

 VImageKit2->FileIO->FileName = AppPath + "\\temp.tif"; //テンポラリファイル名
 VImageKit2->FileIO->TiffAppend = true; //マルチTiff

 VImageKit1->LayerNo = -1;   
 VImageKit1->FileIO.FileName = AppPath + "\\abc.tif"; //ファイル名
 if (VImageKit1->FileIO->GetImageFileType() == false) return;
 SaveType = VImageKit1->FileIO->FileType - 3; //SaveFileメソッド用に変更(同じ形式で保存)

 for (i = 1; i <= VImageKit1->FileIO->FileMaxPage)
 {
   if (i == 3) continue;
   VImageKit1->FileIO->LoadPage = i - 1;
   VImageKit1->FileIO->LoadFile(vikLoad);
   
   VImageKit2->FileIO->SaveFile((TVIkSaveFile)SaveType, VImageKit1->ImageHandle);

 }
 DeleteFile(VImageKit1->FileIO->FileName); //ファイル削除
 RenameFile(VImageKit2->FileIO->FileName, VImageKit1->FileIO->FileName); //ファイル名変更

Delphi
 i, SaveType: Integer;
 AppPath: string;

 VImageKit2.FileIO.FileName := AppPath + '\temp.tif'; //テンポラリファイル名
 VImageKit2.FileIO.TiffAppend := True; //マルチTiff

 VImageKit1.LayerNo := -1;   
 VImageKit1.FileIO.FileName := AppPath + '\abc.tif'; //ファイル名
 if VImageKit1.FileIO.GetImageFileType() = False then Exit;
 SaveType := VImageKit1.FileIO.FileType - 3; //SaveFileメソッド用に変更(同じ形式で保存)

 for i := 1 to VImageKit1.FileIO.FileMaxPage do
 begin
   if i = 3 then Continue;
   VImageKit1.FileIO.LoadPage := i - 1;
   VImageKit1.FileIO.LoadFile(vikLoad);
   
   VImageKit2.FileIO.SaveFile(TVIkSaveFile(SaveType), VImageKit1.ImageHandle);

 end;
 DeleteFile(VImageKit1.FileIO.FileName); //ファイル削除
 RenameFile(VImageKit2.FileIO.FileName, VImageKit1.FileIO.FileName); //ファイル名変更

23

Q. TWAINの標準 Capability だけではなく各社独自のCustom Capabilitiyもサポートしていますか?

2012/11/07

A. エプソン、パナソニック、キヤノンの3つのメーカのいくつかのCustom Capabilitiyをサポートしています。

(1)エプソン
・拡張UIモード(全自動、ホーム、オフィス、プロフェッショナルなど)
・ADF使用時の裏面回転(裏面の向きを表面に合わせる)
・読み取り速度
・アンシャープマスク
・モアレ除去
・用紙サイズ自動検知
・ガンマ補正
・カラー白黒自動検知
・白紙ページ除去
・パンチ穴除去
・焦点位置調整
・文字くっきり
・透過原稿のポジフィルム
(2)パナソニック
・白黒/カラー自動判別
・ダイナミックスレッシュホールド
・読み取り速度
・画質
・デスキュースムージング
・マルチストリーム
・白紙ページ除去
・パンチ穴除去
・原稿補正
(3)キヤノン(DRスキャナ)
・ドロップアウトカラー
・用紙サイズ自動検知
・モアレ除去
・カラー白黒検知
・画像の回転
・文字向き検知
・エッジ強調
・白紙ページ除去
・パンチ穴除去
・テキストエンハンスメント
・マルチストリーム
(4)PFU
・白黒/カラー自動判別
・マルチストリーム

22

Q. 対応しているSXFのバージョンはいくつでしょうか?

2012/11/07

A. バージョン3のレベル2ですが、すべての項目に対応しているわけではありません。ハッチングなどは未対応です。

21

Q. イメージ編集ツールバーではアンドゥ(Undo)が可能ですが、リドゥ(Redo)も可能ですか?

2012/11/07

A. リドゥはできません。

20

Q. イメージ編集ツールバーを使用せずに、コードからベクトルイメージを編集したいのですが可能ですか?

2012/11/07

A. ベクトルイメージに関する描画コマンドを公開していないため、コードから直接編集することはできません。

19

Q. イメージキットコントロールのLayerイメージ(ラスタ)のメモリハンドルにテキストなどを描画してもコントロールに表示されないのですが?

2012/11/07

A. Layerイメージ(ラスタ)の場合、LayerのImageHandleプロパティにメモリハンドルを設定した段階で透過情報を考慮するため、その後で描画してもコントロールには描画されません(メモリハンドルの内容は更新されています)。
そのため、LayerのTransparentプロパティをFalseに設定してから描画するか、一度メモリハンドルを変数に設定してから描画を行い、その値をImageHandleプロパティに設定してください。

例:
(1)TransparentプロパティをFalseに設定する場合

C++Builder
 bool Ret;

 //既にLayerイメージ(ラスタ)が設定済みであることを前提に記述しています。
 VImageKit1->Layer[0]->Transparent = false; //一度Falseに切り替えます
 VImageKit1->PrintDraw->ClearProperty();
 VImageKit1->PrintDraw->FontName = "メイリオ";
 VImageKit1->PrintDraw->TextForeColor = clRed;
 VImageKit1->PrintDraw->FontSize = 10;
 VImageKit1->PrintDraw->FontBold = true;
 VImageKit1->PrintDraw->FontItalic = true;
 VImageKit1->PrintDraw->Transparent = true;
 VImageKit1->PrintDraw->Text = "テキスト";
 Ret = VImageKit1->PrintDraw->TextOut(VImageKit1->Layer[0]->ImageHandle, 20, 20,  vikMemoryHandle);
 VImageKit1->Layer[0]->Transparent = true; //再度Trueを設定
 VImageKit1->Refresh();
Delphi
 Ret: Boolean;

 //既にLayerイメージ(ラスタ)が設定済みであることを前提に記述しています。
 VImageKit1.Layer[0].Transparent := False; //一度Falseに切り替えます
 VImageKit1.PrintDraw.ClearProperty;
 VImageKit1.PrintDraw.FontName := 'メイリオ';
 VImageKit1.PrintDraw.TextForeColor := clRed;
 VImageKit1.PrintDraw.FontSize := 10;
 VImageKit1.PrintDraw.FontBold := True;
 VImageKit1.PrintDraw.FontItalic := True;
 VImageKit1.PrintDraw.Transparent := True;
 VImageKit1.PrintDraw.Text := 'テキスト';
 Ret := VImageKit1.PrintDraw.TextOut(VImageKit1.Layer[0].ImageHandle, 20, 20,  vikMemoryHandle);
 VImageKit1.Layer[0].Transparent := True; //再度Trueを設定
 VImageKit1.Refresh;
(2)変数に代入する場合
C++Builder
 
UINT ImageHandle;
 bool Ret;

 //既にLayerイメージ(ラスタ)が設定済みであることを前提に記述しています。
  ImageHandle = VImageKit1.Layer[0].ImageHandle; //ロードした画像

 VImageKit1->PrintDraw->ClearProperty();
 VImageKit1->PrintDraw->FontName = "メイリオ";
 VImageKit1->PrintDraw->TextForeColor = clRed;
 VImageKit1->PrintDraw->FontSize = 10;
 VImageKit1->PrintDraw->FontBold = true;
 VImageKit1->PrintDraw->FontItalic = true;
 VImageKit1->PrintDraw->Transparent = true;
 VImageKit1->PrintDraw->Text = "テキスト";
 Ret = VImageKit1->PrintDraw->TextOut(ImageHandle, 20, 20, vikMemoryHandle);
 VImageKit1->Layer[0].ImageHandle = ImageHande; //テキストを追加した画像
 VImageKit1->Refresh();

Delphi
 ImageHandle: THandle;
 
Ret: Boolean;

 //既にLayerイメージ(ラスタ)が設定済みであることを前提に記述しています。
 ImageHandle := VImageKit1.Layer[0].ImageHandle; //ロードした画像

 VImageKit1.PrintDraw.ClearProperty;
 VImageKit1.PrintDraw.FontName := 'メイリオ';
 VImageKit1.PrintDraw.TextForeColor := clRed;
 VImageKit1.PrintDraw.FontSize := 10;
 VImageKit1.PrintDraw.FontBold := True;
 VImageKit1.PrintDraw.FontItalic := True;
 VImageKit1.PrintDraw.Transparent := True;
 VImageKit1.PrintDraw.Text := 'テキスト';
 Ret := VImageKit1.PrintDraw.TextOut(ImageHandle, 20, 20, vikMemoryHandle);
 VImageKit1.Layer[0].ImageHandle := ImageHande; //テキストを追加した画像
 VImageKit1.Refresh;

18

Q. マルチTiffファイルを作成するにはどうすればよいですか?

2012/11/07

A. 次の例を参考にしてください。

1.スキャナおよびデジタルカメラから取得した画像を保存する場合
 C++Builder
  bool Ret; 
  VImageKit1->FileIO->FileName = "abc.tif"; //ファイル名
  VImageKit1->FileIO->TiffAppend = true; //マルチTiff

  VImageKit1->Scan->TransferMode = vikScanMemory; //or vikScanNative
  Ret = VImageKit1->Scan->Execute(); //スキャン

   //読み取りイベント
  void __fastcall TForm1::VImageKit1AfterScan(TObject *Sender, DWORD DibHandle, DWORD OrgHandle, int ImageCount, short BitOrder)
  {
    VImageKit1->FileIO->SaveFile(vikSaveTIFFNoncompressed, DibHandle);
 
  }
 Delphi
  Ret: Boolean
  VImageKit1.FileIO.FileName := 'abc.tif'; //ファイル名
  VImageKit1.FileIO.TiffAppend := True; //マルチTiff

  VImageKit1.Scan.TransferMode := vikScanMemory; //or vikScanNative
  Ret := VImageKit1.Scan.Execute(); //スキャン

  //読み取りイベント
  procedure TForm1.VImageKit1AfterScan(Sender: TObject; DibHandle, OrgHandle: Cardinal; ImageCount: Integer; BitOrder: Smallint);
  begin
    VImageKit1.FileIO.SaveFile(vikSaveTIFFNoncompressed, DibHandle);
 
  end;

※データソースがファイル転送かつマルチTiff形式をサポートしている場合はFileIOクラスを使用せずにScanクラスのプロパティを設定するだけでマルチTiffファイルを作成することができます。

2.複数の画像ファイルを1つのファイルに保存する場合
C++Builder
 int i;
 VImageKit2->FileIO->FileName = "abc.tif"; //ファイル名
 VImageKit2->FileIO->TiffAppend = true; //マルチTiff

 VImageKit1->LayerNo = -1;   
 VImageKit1->FileIO->LoadPage = 0;   

 //001.jpg ... 005.jpgを1つにまとめる
 for (i = 0; i <= 5; i++)
 {
   VImageKit1->FileIO->FileName = Format("%.3d", ARRAYOFCONST((i))) + ".jpg"; //ファイル名
   VImageKit1->FileIO->LoadFile(vikLoad);
   
   VImageKit2->FileIO->SaveFile(vikSaveTIFFNoncompressed, ImageKit1.ImageHandle);
 
 }
Delphi
 i: Integer;
 VImageKit2.FileIO.FileName := 'abc.tif'; //ファイル名
 VImageKit2.FileIO.TiffAppend := True; //マルチTiff

 VImageKit1.LayerNo := -1;   
 VImageKit1.FileIO.LoadPage := 0;   

 //001.jpg ... 005.jpgを1つにまとめる
 for i : = 1 to 5 do
 begin
   VImageKit1.FileIO.FileName := Format('%.3d', [i]) + '.jpg'; //ファイル名
   VImageKit1.FileIO.LoadFile(vikLoad);
   
   VImageKit2.FileIO.SaveFile(vikSaveTIFFNoncompressed, ImageKit1.ImageHandle);
 
 end;

17

Q. サムネイルコントロールのサムネイル画像1個の大きさはどのように決まるのですか?

2012/11/07

A. 表示するサムネイル画像の縦方向の数と横方向の数で決まります。そのため、サムネイルコントロールの大きさが同じであれば、サムネイルの行数と列数が少ない方が描画エリアは相対的に大きくなります。実際にはImageSizeプロパティとサムネイルのコマの大きさにより描画されるサイズが決まります。

16

Q. 画像の縦横のピクセルからインチもしくはセンチメートルに換算するにはどうすればよいですか?

2012/11/07

A. 次の例を参考にしてください。

VCLの例:
C++Builder
 float inchX, inchY;
 float cmX, cmY;

 VImageKit1->LayerNo = -1;
 VImageKit1->FileIO->FileName = "abc.tif"; //ファイル名
 if (VImageKit1->FileIO->LoadFile(vikLoad) == false) return;

 if (VImageKit1->Xdpi != 0)

 {
   //インチ
   inchX = 1.0 * VImageKit1->ImageWidth / VImageKit1->Xdpi;
   //センチメートル
   cmX = inchX * 2.54;
 }
 if (VImageKit1->Ydpi != 0)
 {
   //インチ
   inchY = 1.0 * VImageKit1->ImageHeight / VImageKit1->Ydpi;
   //センチメートル
   cmY = inchY * 2.54;
 }

Delphi
 inchX, inchY: Single;
 cmX, cmY: Single;

 VImageKit1.LayerNo := -1;
 VImageKit1.FileIO.FileName := 'abc.tif'; //ファイル名
 if VImageKit1.FileIO.LoadFile(vikLoad) = False then Exit;

 if VImageKit1.Xdpi <> 0 then

 begin
   //インチ
   inchX := VImageKit1.ImageWidth / VImageKit1.Xdpi;
   //センチメートル
   cmX := inchX * 2.54;
 end;
 if VImageKit1.Ydpi <> 0 then
 begin
   //インチ
   inchY := VImageKit1.ImageHeight / VImageKit1.Ydpi;
   //センチメートル
   cmY := inchY * 2.54;
 end;

15

Q. 印刷ダイアログを表示する際に[ページ指定]を有効にするにはどうすればよいですか?

2012/11/07

A. 次の例を参考にしてください(詳しくはヘルプなどを参照のこと)。

VCLの例:
C++Builder
 bool Ret; 
 VImageKit1->PrintDraw->PrintRange = prPageNums;
 VImageKit1->PrintDraw->MinPage = 1;
 VImageKit1->PrintDraw->MaxPage = 3;
 VImageKit1->PrintDraw->FromPage = 1;
 VImageKit1->PrintDraw->ToPage = 3;
 Ret = ImageKit1->PrintDraw->PrintDialog();

Delphi
 
Ret: Boolean;
 VImageKit1.PrintDraw.PrintRange := prPageNums;
 VImageKit1.PrintDraw.MaxPage := 3;
 VImageKit1.PrintDraw.FromPage := 1;
 VImageKit1.PrintDraw.ToPage := 3;
 Ret := ImageKit1.PrintDraw.PrintDialog();


※MinPageとMaxPageプロパティが共に1の場合は、[ページ指定]は有効になりません。

14

Q. サムネイルコントロールでExif形式のファイルを参照する場合、Exifに含まれるサムネイル画像を利用しているのでしょうか?

2012/11/07

A. ImageSizeプロパティの値がExifに含まれるサムネイル画像の縦と横のピクセルよりも小さい場合は、Exif内のサムネイル画像を利用しております。

13

Q. 開発環境では正しく動作しますが、配布環境では特定のファイル形式が利用できません。どうすればよいですか?

2012/11/07

A. 配布環境にそのファイル形式を利用する"Ik8***.dll"(***はファイル形式)が存在するかどうか確認し、存在しない場合は該当ファイルをコピーしてください。

1.実行時パッケージをご利用の場合
bplファイルと同じフォルダに該当するdllファイルが存在するか?
2.設計時パッケージをご利用の場合
exeファイルと同じフォルダ、もしくはパスの通ったフォルダに該当するdllファイルが存在するか?

12

Q. イメージキットコントロールの描画領域をTImageにコピーしたいのですが、どうすればよいですか?

2012/11/07

A. 次のコードを参考にしてください。

C++Builder
  VImageKit1->Edit->EditEnable = true;

  Image1->Width  = VImageKit1->ClientWidth;
  Image1->Height = VImageKit1->ClientHeight;

  StretchBlt(Image1->Canvas->Handle, 0, 0, Image1->Width, Image1->Height, VImageKit1->ImageHdc, 0, 0, VImageKit1->ClientWidth, VImageKit1->ClientHeight, cmSrcCopy);

  VImageKit1->Edit->EditEnable = false;
Delphi
  VImageKit1.Edit.EditEnable := True;

  Image1.Width  := VImageKit1.ClientWidth;
  Image1.Height := VImageKit1.ClientHeight;

  StretchBlt(Image1.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, VImageKit1.ImageHdc, 0, 0, VImageKit1.ClientWidth, VImageKit1.ClientHeight, cmSrcCopy);

  VImageKit1.Edit.EditEnable := False;

11

Q. イメージキットコントロールのLayerプロパティに設定されたラスタイメージをイメージ編集ツールバーで編集できますか?

2012/11/07

A. できません。PrinDrawプロパティのメソッドを利用してテキストや図形を描画してください。ただし、スタンプやエアブラシの機能はPritDrawには実装されておりません。

10

Q. スキャンデバイスからプレビュー(もしくは取り込み)を行うと、機種やドライバのバージョンによっては「不正な浮動小数点演算命令」が発生します。どうすればよいですか?

2012/11/07

A. TWAINドライバの不具合が考えられますので、新しいバージョンのTWAINドライバを適用してください。それでも現象が再現する場合は、FPU例外を無効にしてお試しください。

VCLの例:
C++Builder
  VImageKit1->Scan->FpuException = true;
  VImageKit1->Scan->Execute();
Delphi
  VImageKit1.Scan.FpuException := True;
  VImageKit1.Scan.Execute();

DLLの例:
C++Builder
  Word Saved8087CW = Default8087CW;
  Set8087CW(0x133f);
  IKScanExec(...);
  Set8087CW(Saved8087CW);

Delphi

var
  Saved8087CW: Word;

  Saved8087CW := Default8087CW;
  Set8087CW($133f);
  IKScanExec(...);
  Set8087CW(Saved8087CW);

9

Q. Delphiを使用してVImageKit.Effectのメソッドの第一引数にSlice関数を記述してコンパイルすると"Sliceはオープン配列引数としてしか使えません"というエラーが発生しますが、どうすればよいですか?

2012/11/07

A. 次のコードを参考にしてください。×はエラーが発生するコードで○は正しくコンパイルできるコードを表します。

・Move手続きを使用する。
×
VImageKit1.Effect.SelectImage(Slice(Pt, Points), 255, 255, 255);

var Pt_Slice: array of TPoint;
SetLength(Pt_Slice, Points);
Move(Pt, Pt_Slice[0], SizeOf(TPoint) * Points);
VImageKit1.Effect.SelectImage(Pt_Slice, 255, 255, 255);


・Slice関数をメソッドの引数に直接渡さず、別の関数(手続き)の引数として渡す。
×
VImageKit1.Effect.SelectImage(Slice(Pt, Points), 255, 255, 255);

SelectImageSub(Slice(Pt, Points));
procedure TForm1.SelectImageSub(const Pt: array of TPoint);
begin
  VImageKit1.Effect.SelectImage(Pt, 255, 255, 255);
end;

8

Q. プリンタ選択型コモンダイアログを表示しないで、プリンタに出力するにはどうすればよいですか?

2012/11/07

A. 次の例を参考にしてください(詳しくはヘルプなどを参照のこと)。

1.通常使うプリンタに出力
  C++Builder
 bool Ret; 

 VImageKit1->PrintDraw->PrintFileName = "Default";
 Ret = ImageKit1->PrintDraw->PrintCreateDC(vikPrintFileName);
 if (Ret == false) return;
 //印刷処理・・・・

 Delphi
 Ret: Boolean

 VImageKit1.PrintDraw.PrintFileName := 'Default';
 Ret := ImageKit1.PrintDraw.PrintCreateDC(vikPrintFileName);
 if Ret = False then Exit;
 //印刷処理・・・・


2.指定したプリンタに出力
  C++Builder
 bool Ret; 

 //PrinterNameプロパティにはEnumPrintersメソッドで取得したプリンタの名称を設定
 VImageKit1->PrintDraw->PrinterName = "xxxxxx";
 Ret = VImageKit1->PrintDraw->PrintCreateDC(vikPrinterName);
 if (Ret == false) return;
 //印刷処理・・・・
 Delphi
 Ret: Boolean

 //PrinterNameプロパティにはEnumPrintersメソッドで取得したプリンタの名称を設定
 VImageKit1.PrintDraw.PrinterName := 'xxxxxx';
 Ret := VImageKit1.PrintDraw.PrintCreateDC(vikPrinterName);
 if Ret = False then Exit;
 //印刷処理・・・・

1,2に関わらず印刷条件を変更して出力する場合は、GetDevModeHandleでDEVMODE構造体のハンドルを取得し、SetDevModeInfoで条件を設定した後にPrintCreateDCを実行します。DLLで使用する場合はIKSetDevModeInfoを実行する前にIKGetDevModeInfoを実行する必要があります。

7

Q. 設定した用紙サイズいっぱいに画像を印刷するにはどうすればよいですか?

2012/11/07

A. GetPaperSizeで有効印字領域を取得し、ImageOutで出力します。

VCLの例:
C++Builder
bool Ret;
int ALeft, ATop, ARight, ABottom, AWidth, AHeight;

//用紙サイズ及び印字有効領域を取得
Ret = VImageKit1->PrintDraw->GetPaperSize(DC, ALeft, ATop, ARight, ABottom, AWidth, AHeight, vikPrinterPixel);
//有効領域いっぱいに印字
Ret = VImageKit1->PrintDraw->ImageOut(DC, ImgHandle, 0, 0, ARight - ALeft, ABottom - ATop, false, true, vikPrinterPixel);
Delphi
Ret: Boolean;
ALeft, ATop, ARight, ABottom, AWidth, AHeight: Integer;

//用紙サイズ及び印字有効領域を取得
Ret := VImageKit1.PrintDraw.GetPaperSize(DC, ALeft, ATop, ARight, ABottom, AWidth, AHeight, vikPrinterPixel);
//有効領域いっぱいに印字
Ret := VImageKit1.PrintDraw.ImageOut(DC, ImgHandle, 0, 0, ARight - ALeft, ABottom - ATop, False, True, vikPrinterPixel);

DLLの例:
C++Builder
BOOL Ret;
RECT Rect1, Rect2;
long AWidth, AHeight;

//用紙サイズ及び印字有効領域を取得
Ret = IKGetPaperSize(DC, &Rect1, &AWidth, &AHeight, 1);
//有効領域いっぱいに印字
Rect2.left = 0;
Rect2.top = 0;
Rect2.right = Rect1.right - Rect1.left;
Rect2.bottom = Rect1.bottom - Rect1.top;
Ret = IKImageOut(DC, ImgHandle, &Rect2, FALSE, TRUE, 1);
Delphi
Ret: LongBool;
Rect1, Rect2: TRect;
AWidth, AHeight: Longint;

//用紙サイズ及び印字有効領域を取得
Ret := IKGetPaperSize(DC, Rect1, AWidth, AHeight, 1);
//有効領域いっぱいに印字
Rect2.Left := 0;
Rect2.Top := 0;
Rect2.Right := Rect1.Right - Rect1.Left;
Rect2.Bottom := Rect1.Bottom - Rect1.Top;
Ret := IKImageOut(DC, ImgHandle, Rect2, False, True, 1);

6

Q. JPEG形式でファイルに保存しようとしているのですが上手くいきません。どうしてでしょうか?

2012/11/07

A. JPEGとして保存できるのは8ビットグレースケールと24ビットカラーのイメージが対象です。それ以外のイメージの場合は一度該当する色数に変換してから保存する必要があります(詳しくはリファレンスやヘルプを参照のこと)。

5

Q. VCLで利用する場合にもDLLファイルが必要ですか?

2012/11/07

A. 必要です。必要なDLLファイルについてはコントロールリファレンス(ImgKit8VclCtl.pdf)の「作成したアプリケーションの配布」のページをご覧ください。なお、DLLファイルが存在しない場合はメソッドの実行に失敗します。

4

Q. サムネイルコントロールに表示されているイメージの総数を取得したいのですが?

2012/11/07

A. ShowThumbImageイベントの引数MaxImageを参照してください。

3

Q. メモリハンドルをTPictureやTBitmapとの間でやりとりしたいのですが?

2012/11/07

A. いくつかの方法があります。
「ImageKit8 VCL<-->TPicture」
・イメージキットコントロールのPictureプロパティを使用する。
「ImageKit8 VCL-->TBitmap」
・イメージキットコントロールあるいはコモンコントロールのBitmapFromDibメソッド(DLLはIKBitmapFromDib)を使用する。
・クリップボードを使用する。
・TBitmapで読める形式のファイルで渡す。
「ImageKit8 VCL<--TBitmap」
・イメージキットコントロールあるいはコモンコントロールのDibFromBitmapメソッド(DLLはIKDibFromBitmap)を使用する。
・クリップボードを使用する。
・ImageKit8 VCLで読める形式のファイルで渡す。

2

Q. DLLのサンプルを実行するとメモリ読込違反などのエラーが発生するのですが?

2012/11/07

A. ImageKit8 VCLをインストールしたフォルダの階層化にあるXXXX\SystemフォルダのDLLファイルをパスの通ったフォルダもしくはサンプルと同じフォルダにコピーしてください。(XXXXはC++Builder2007やDelphi2007など)
※同様な記述がプログラミングガイド(ImgKit8Vcl.pdf)の「インストール」のページにもあります。

1

Q. ImageKit7 VCL で提供されていた ImageKit6 VCL 互換コントロールやスライドショウコントロールはImageKit8 VCL にも含まれますか?

2012/11/07

A. いいえ。ImageKit8 VCL には、以前の ImageKit との互換コントロールやスライドショウコントロールはありません。

Copyright (C) NEWTONE Corporation. All rights reserved.