CJocrPrimクラス ラスタ編集コマンド

目次
  1. 概要
  2. ラスタ編集の準備
  3. プリミティブの削除
  4. プリミティブの挿入
  5. プリミティブの移動
  6. プリミティブの切断(切れ目の幅0)
  7. プリミティブの切断(切れ目の幅1)

概要

CJocrPrimクラスにおいて、ラスタ編集機能をサポートしました。
当初、サブクラスによってサポートしておりましたが、CJocrPrimクラスのサブクラスを 独自に開発して利用しているユーザーの便宜をはかるため、ルートクラスであるCJocrPrim クラスでのサポートに変更した。
ラスタ編集を利用するには、最初に編集用のプリミティブバッファの確保してから、プリミ ティブ削除、挿入、移動、切断の各コマンドを用いる。
目次


1 ラスタ編集の準備


目次

ラスタ編集で用いるバッファをプリミティブ数で指定します。最初のmakeprimの前に実行します。
プリミティブ一つあたり28バイトの確保領域に過ぎないので数千~百万程度を指定します。
挿入プリミティブ数が増えてバッファオーバーフローするような場合は、
  1. 現在のバッファをアンドゥ機能サポート関数で退避
  2. バッファを拡張してmakeprimしなおしバッファを戻す
とう処理が必要となり、非効率ですが対処はできます。

// 挿入可能なプリミティブ数の上限を設定する
// 上限に達した場合は、medit_insertやmedit_separateでエラーが返る
// その場合はクラスをいったん破棄して、再度new、その後msetinsertmaxしなおしてから再挿入
// 入力
//	int			insertmax;		デフォルト値は0、通常のA3,400dpi日本語文書では10000で十分
	void			msetinsertmax(int insertmax){minsertmax = insertmax;}
サンプルコード
#include    "ocrdef.h"
#include    "ocrco.h"
#include    "cjocrprim.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrim* pjocrprim = new CJocrPrim("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
pjocrprm->msetdpi(400);
pjocrprm->msetinsertmax(10000);
ret = pjocrprim->makeprim();
if(ret < 0) {
    エラー;
}
delete pjocrprim;
...
目次


2 プリミティブの削除


目次

指定したプリミティブあるいは指定したクラスタに属するプリミティブ全てを削除します。
同時に元画像に反映させるかどうかを指定することができます。

// プリミティブ/クラスタを削除
// 入力
//   int        flag;       1...画像データに反映させる/0...させない
//	 PRIMITIVE* prim;       プリミティブ(アドレスを用いるのでコピーは駄目)
// 戻り値
//   0          正常終了
//   負         エラー
	int				medit_delete(int flag,PRIMITIVE* prim);
	int				medit_delete(int flag,CLUSTER* pcluster);
サンプルコード
#include    "ocrdef.h"
#include    "ocrco.h"
#include    "cjocrprim.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrim* pjocrprim = new CJocrPrim("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
pjocrprm->msetdpi(400);
pjocrprm->msetinsertmax(10000);
ret = pjocrprim->makeprim();
if(ret < 0) {
    エラー;
}
// 1...プリミティブの選択操作、クラスタの抽出操作
// 2...選択したプリミティブを削除して元画像にも反映させる場合
int i1 = pjocrprim->medit_delete(1,prim);
if(i1 < 0) {
    エラー;
}
delete pjocrprim;
...
目次


2 プリミティブの挿入


目次

挿入するプリミティブは、別のCJocrPrimのインスタンスを作成してmakeprim等で作成したもの。 挿入したプリミティブの新しいアドレスを取得することも可能
同時に元画像に反映させるかどうかを指定することができます。
挿入先で他のプリミティブと位置が重なる場合でも、データ上は別のプリミティブとして 分かれています。

// プリミティブを挿入(pjocrprimがthisの場合はコピーとなる)
// 入力
//	int        flag;        1...画像データに反映させる/0...させない
//	CJocrPrim* pjocrprim;   primの属するCJocrPrimのインスタンス
//	PRIMITIVE* prim;        プリミティブ(アドレスを用いるのでコピーは駄目)
//	CLUSTER*   pcluster;    クラスタ(アドレスを用いるのでコピーは駄目)
//	int        left,top;    移動先
// 出力
//	PRIMITIVE*&priminsert;  挿入プリミティブのアドレス
// 戻り値
//   0          正常終了
//   負         エラー
	int				medit_insert(int flag,CJocrPrim* pjocrprim,PRIMITIVE* prim,int left,int top,PRIMITIVE*& priminsert);
	int				medit_insert(int flag,CJocrPrim* pjocrprim,CLUSTER* pcluster,int left,int top);
// 全てのプリミティブをクラスタ化
// レンダリングやクラスタ移動に用いる
	int				mallprim2cluster();
サンプルコード
#include    "ocrdef.h"
#include    "ocrco.h"
#include    "cjocrprim.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrim* pjocrprim = new CJocrPrim("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
pjocrprm->msetdpi(400);
pjocrprm->msetinsertmax(10000);
ret = pjocrprim->makeprim();
if(ret < 0) {
    エラー;
}
// 1...挿入する画像に対して別のCJocrPrimのインスタンスpjocrprim1でmakeprim
// 2...makeallprim2clusterで全てのプリミティブを一つのクラスタにまとめる
// 3...クラスタを指定位置に挿入する
int i1 = pjocrprim->medit_insert(1,pjocrprim1,pcluster,100,100);
if(i1 < 0) {
    エラー;
}
delete pjocrprim;
...
目次


2 プリミティブの移動


目次

移動するプリミティブのアドレス、あるいは移動するプリミティブの集合であるクラスタを 指定して、プリミティブあるいはプリミティブ集合(クラスタ)を移動します。
同時に元画像に反映させるかどうかを指定することができます。 移動先で他のプリミティブと位置が重なる場合でも、データ上は別のプリミティブとして 分かれています。

// プリミティブ/クラスタを移動(コピー+削除ではコストが大きいためこちらを用いると良い)
// 入力
//  int         flag;       1...画像データに反映させる/0...させない
//	PRIMITIVE*  prim;       プリミティブ(アドレスを用いるのでコピーは駄目)
//	CLUSTER*    pcluster;   クラスタ(アドレスを用いるのでコピーは駄目)
//	int         left,top;   移動先
// 戻り値
//   0          正常終了
//   負         エラー
  int         medit_move(int flag,PRIMITIVE* prim,int left,int top);
    int         medit_move(int flag,CLUSTER* pcluster,int left,int top);
サンプルコード
#include    "ocrdef.h"
#include    "ocrco.h"
#include    "cjocrprim.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrim* pjocrprim = new CJocrPrim("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
pjocrprm->msetdpi(400);
pjocrprm->msetinsertmax(10000);
ret = pjocrprim->makeprim();
if(ret < 0) {
    エラー;
}
// 1...プリミティブ選択あるいはクラスタ抽出操作
// 2...指定したプリミティブを移動して元画像に反映させる
int i1 = pjocrprim->medit_move(1,prim,100,100);
if(i1 < 0) {
    エラー;
}
delete pjocrprim;
...
目次


2 プリミティブの切断(切れ目の幅0)


目次


クラスターとひとつ以上の線分を指定してプリミティブを切断します。切れ目の幅0の切断では、画像 の見た目では切れていることは分かりませんが、データ構造上は切断されています。移動や削除によ って切断されていることを確認することができます。

// クラスタを分割(ピクセルデータの消長が存在しない。表示上切れ目は存在しない)
// (処理コストが高いので注意:分割対象が多い場合は再初期化のほうが速い)
// 1...分割対象プリミティブをクラスタとしてコピー
// 入力
//  int         linenum;     切断線の数
//  int*		px1;         切断線の始点と終点の座標(linenum個ずつ)
//  int*        py1;
//  int*        px2;
//  int*        py2;
//  CLUSTER*    pcluster;    切断対象のクラスタ
// 戻り値
//   0          正常終了
//   負         エラー

	int				medit_separate(int linenum,int* px1,int* py1,int* px2,int* py2,CLUSTER* pcluster);
サンプルコード
#include    "ocrdef.h"
#include    "ocrco.h"
#include    "cjocrprim.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrim* pjocrprim = new CJocrPrim("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
pjocrprm->msetdpi(400);
pjocrprm->msetinsertmax(10000);
ret = pjocrprim->makeprim();
if(ret < 0) {
    エラー;
}
// 1...クラスタ抽出操作
// 2...指定したクラスタを切断
int		x1[1];
int		y1[1];
int		x2[1];
int		y2[1];
x1[0] = 100;
y1[0] = 100;
x2[0] = 200;
y2[0] = 200;
int i1 = pjocrprim->medit_separate(1,x1,y1,x2,y2,pcluster);
if(i1 < 0) {
    エラー;
}
delete pjocrprim;
...
目次


2 プリミティブの切断(切れ目の幅1)


目次


クラスターとひとつ以上の線分を指定してプリミティブを切断します。切れ目の幅1の切断では、画像 の見た目でも切れていることが分かります。

// クラスタを分割(ピクセルデータの消長が存在しない。表示上切れ目は存在しない)
// (処理コストが高いので注意:分割対象が多い場合は再初期化のほうが速い)
// 1...分割対象プリミティブをクラスタとしてコピー
// 入力
//  int         linenum;     切断線の数
//  int*		px1;         切断線の始点と終点の座標(linenum個ずつ)
//  int*        py1;
//  int*        px2;
//  int*        py2;
//  CLUSTER*    pcluster;    切断対象のクラスタ
// 戻り値
//   0          正常終了
//   負         エラー
    int         medit_sever(int linenum,int* px1,int* py1,int* px2,int* py2,CLUSTER* pcluster);
サンプルコード
#include    "ocrdef.h"
#include    "ocrco.h"
#include    "cjocrprim.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrim* pjocrprim = new CJocrPrim("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
pjocrprm->msetdpi(400);
pjocrprm->msetinsertmax(10000);
ret = pjocrprim->makeprim();
if(ret < 0) {
    エラー;
}
// 1...クラスタ抽出操作
// 2...指定したクラスタを切断
int		x1[1];
int		y1[1];
int		x2[1];
int		y2[1];
x1[0] = 100;
y1[0] = 100;
x2[0] = 200;
y2[0] = 200;
int i1 = pjocrprim->medit_sever(1,x1,y1,x2,y2,pcluster);
if(i1 < 0) {
    エラー;
}
delete pjocrprim;
...
目次



マニュアルホームページ

ユーザーズマニュアル