Doodle2 (VBS用画像描画・変換COMコンポーネント )

--------- 2006/09/12 9:00
Vectorで正式公開。メインのプログラムは1.3βと同じだが、メモリマネージャだけ入れ替えた。

これで打ち止め開発終了(バグ対はやるかも)。
-----------------
「WSHやASPではグラフィックが書けないぞ!無いのなら作ってしまえホトトギス!」と、作ってみたのが リリース版 Doodle2 Ver1.0 @Vectorだった。2001年に初版リリースだからもう5年も前だ。

.NET時代で、もはやこういうモノは意味はないんだよなぁ。手間かかるわりに人気ないし(笑)

これが最終版のつもりでバージョンアップに着手。
結局ほぼ全面的に書き直しになっちゃった(笑) 酷いエンバグしてそうな悪寒。

ベータ版 Doodle2 Ver1.3

 Ver1.0と、この1.3の違いは以下のとおり。
  1. GIF圧縮アルゴリズムの改良と新プロパティ導入(LZWをちょっとマジメに実装。古い版に比べるとけっこう頑張って圧縮する-はず)。
  2. 新しい画像フィルタ(グレイスケール、シャープネス/ぼかし、汎用の1次微分フィルタメソッド)
  3. 複数のキャンバスとそれを利用したアニメーションGIF生成
  4. エラーコードの整理統合。すみません、仕様変更です。エラーコードの下位互換性がなくなってます。
 httpからの画像ロード機能とビデオキャプチャ機能は途中まで作ったが(マジで)、あまりにもDLLのサイズがでかくなり過ぎるのと既存機能との親和性の観点から実装中止。

 バグのご指摘はこのエントリのコメント欄でお願いします。

--------- 2006/03/24 追記
 PNG圧縮のところも修正した。というか、既に入れ込んであったPNG圧縮の速度と圧縮率の選択パラメータをCOMインタフェイスで公開するのを忘れていた(爆)
 プロパティとして公開するルーチンを付与して再アップ(ver1.3β2)しましたので、評価していただいている方はお手数ですが再度ダウンロード願います。
[PR]
by SIGNAL-9 | 2006-03-02 16:21 | 拙作ソフトウェア | Comments(31)
Commented by つちや at 2006-03-06 00:05 x
ごぶさたしております。。その節はどうも。

Doodle2でクリップボードの画像をファイルに落とすスクリプトを作ってみたのですが、
Set Doodle = CreateObject("Doodle2.MyCanvas")
R = Doodle.LoadFromClipBoard(False,False,0,0,0)
If R = 0 Then
R = Doodle.SaveToFile(".\ClipBoard.jpg")
Else
WScript.Echo "クリップボードに画像がありません"
End If
これでできた画像をよく見ると、左端のわずかな部分が右端の方にくっついてまして、右端にちょっとラインが入ったようになってしまいます。
これって、何か回避方法ってありませんか?
Commented by SIGNAL-9 at 2006-03-06 09:41
>つちや様
こちらこそご無沙汰を。

各種ビットマップで試してみたのですが、当方の環境だとどうも明確な再現性が見出せません。現象から考えるとJPG変換のところだと思うのですが…
できましたら、再現性のある画像をお教え願えないでしょうか。
Commented by つちや at 2006-03-06 12:53 x
たとえば
http://pya.cc/pyaimg/pimg.php?imgid=24977
の画像ですが、これをコピーして、スクリプトを走らせると、
http://f.hatena.ne.jp/Fio/
のようになります。左がDoodleで、右がIrfanViewです。右は、

Set WS = CreateObject("WScript.Shell")
WS.Run "C:\Soft\IrfanView\i_view32.exe /clippaste /convert=C:\script\ClipBoard2.jpg"

です。実はブラウザでJPEG画像を右クリックしてコピーしスクリプトを走らせるとどのJPEG画像でも再現します。clipcopy.exeというソフトでも同様になるようです。
JPEGまわりのコンポーネントがあやしそうですよね。
Commented by SIGNAL-9 at 2006-03-06 14:11
ぼくのところではでないなぁ…(困)
#ベータ版の1.3の方ですよね?

WindowsXP SP2の最新パッチ済みの環境なんですが、
>http://pya.cc/pyaimg/pimg.php?imgid=24977
>の画像ですが、これをコピーして、スクリプトを走らせると、
同じことをやっても再現しませんです。
う~ん、困った。
Commented by つちや at 2006-03-06 18:29 x
それで私自身の環境を疑っていろいろ試して原因がわかりました。Operaのようです。Operaで保存したりすると正常なんですが、画像をコピーするとずれるみたいですね。でも、IrfanViewは直して保存してくれていたので(なぜ修正できるの?)、Doodleの使っているDelphiのコンポーネントのせいだとばかり思っていました。
大変失礼しました。IEやSleipnir1.66や2の方では正常でした。お騒がせしてすみません(恥ずかしい。。。)。これからもよろしくお願いします。
Commented by SIGNAL-9 at 2006-03-07 08:59
>Operaのようです。
使ってないんですが、おもしろいバグ(?)ですね。

ココの部分、おっしゃるとおりDelphi6の標準機能で、
Win32のSourceBMP.Assign(ClipBoard) してから、JPEGユニット使ってSaveしているだけなので、ぼくもTBitmapかTJPEGImageの問題かと思っていました。
とりあえず、対処はペンディングということで。

引き続き問題あればご指摘お願いします。
Commented by 小鉄 at 2007-02-13 12:40 x
はじめまして。

エクセルのVBAでDoodleを使用して円を書きたいのですが、
Call d.Circle(X, Y, R, False)とするとエラーが出てしまいます。
Circleの代わりにEllipseを使えば問題ありません。
同様にLineも使用できません。

エラーというのは実行時のエラーではなくコンパイラエラーです。
どうも「Circle」や「Line」はエクセルVBA関数と干渉しているようです。
(素人なので表現が正しくできずすみません)
何か回避方法は無いでしょうか。



Commented by SIGNAL-9 at 2007-02-13 15:37
小鉄様
拙作に興味を持っていただきありがとう御座います。

>どうも「Circle」や「Line」はエクセルVBA関数と干渉しているようです。

VBAですと処理系によって予約語のチェックに引っかかる場合があります。

この場合ですが、”エスケープ識別子”を使って;
Call [D.Line(0, 0, MaxWidth, MaxHeight)] '線を引く
のようにしてみて試してみて頂けませんか。
#Doodleの命令文の部分を[]で括る、ということです。
Commented by 小鉄 at 2007-02-16 09:54 x
ご返答ありがとうございました。
風邪でダウンしており返信が遅くなり申し訳ありませんでした。

エスケープ識別子、うまく動きませんでした。
コンパイルエラーも実行時エラーも出ないのですが
線も円も何も描画されないままの元画像が出力されただけでした。
[]の位置とかも色々変えてみましたが無理でした。

とりあえずVBAは諦めてVBSで実行させる事にします。
ありがとうございました。
Commented by SIGNAL-9 at 2007-02-16 13:01
小鉄様、大変失礼致しました。
おっしゃるとおり、エラーにはならないものの動作しないようです。

VBAの仕様なんでしょうが、知りませんでした。申し訳ないです。
おっしゃるとおり、VBSが選択できるのならそちらでお願いいたします。
あるいは、お書きになっているとおり
>Circleの代わりにEllipseを使えば問題ありません。
LineはBoxで代用できますので、そちらをお使いいただくとか。

#予約語とかち合わないメソッド名のインタフェイスを追加すればいいのでしょうが…。ご要望があれば追加しますが。
Commented by 小鉄 at 2007-02-16 16:49 x
お気遣いありがとうございます。

仕事の関係で、大きな地図から指定区域を切り取って、その中心に●や▲の印を付けたかったのです。(約4000枚)
地図を切り取る座標がエクセルだったのでVBAで一括処理しようと思いました。
●はEllipseで、▲は文字(フォント)で代用させていただきました。
文字(フォント)だと中心が少しズレましたけど問題ではありません。
おかげで約4000枚の処理が15分程度でおわりました。
本当にありがとうございました。
Commented by 魔界の仮面弁士 at 2007-09-26 17:40 x
半年経っているので、今更ですが:

> Call [D.Line(0, 0, MaxWidth, MaxHeight)] '線を引く
そうではなく、
 Call D.[Line](0, 0, MaxWidth, MaxHeight)
もしくは
 D.[Line] 0, 0, MaxWidth, MaxHeight
もしくは
 CallByName D, "Line", VbMethod, 0, 0, MaxWidth, MaxHeight
という構文になるかと。
Commented by SIGNAL-9 at 2007-09-27 12:46
魔界の仮面弁士さんのような超有名人の方にフォローいただき感謝にたえません。

最近めっきりコンピュータからは縁遠くなっておりまして、ブログでも取り上げられるネタがなくなっておりますが(笑)、拙作の中にも、いまだにお使い続けて下さっている方がいらっしゃる幸せなモノもあるようですので、このように有益な情報を残していただけると、後の方の参考になると思います。
再度、ありがとうございます。
Commented by skierbasser at 2007-09-28 18:11 x
ご無沙汰しております。覚えていらっしゃいますか?
「数寄屋橋」名付け親の師匠には覚えておいて欲しいところですw

ほとんどスクリプトなんて世界から離れておりましたが、サーバーH/W
更新に伴うアプリの移設なんてことで、久々に秀丸でしこしこw
そういや師匠のDoodle2も入れてたな。ってことでここに
たどり着きました。

お元気そうで何よりですね。
いや、お互い老体にむち打って死にかけかも^^;

ああ、Ver1.3使ってみましたが、何ら問題ありませんでしたよ。
そんな難しいことしてないので、アレですけど。
Commented by SIGNAL-9 at 2007-10-01 10:49
>ご無沙汰しております。覚えていらっしゃいますか?
忘れてるわけないじゃないですか。お久しぶりです。

私も、最近は実装系から手を離しちゃって(離さざるをえなくなって)、このブログも何がなんだか、もう(笑)

よかったらたまにでも覗いてやってくださいませ。
Commented by えんどぅ at 2010-05-08 14:25 x
はじめまして。
ASPにてdoodle2を利用させていただいております。

ただ、どうしてもよく分からない部分がありましたので、ご質問させていただきます。
JPEG画像をアップロードし、その画像のサムネイルを生成して保存したいのですが、
その際の背景色の設定が分かりません。
コードは下記のとおりです。

Set objd2 = CreateObject("Doodle2.MyCanvas")

objd2.JPEGCompressionQuality = 80
objd2.BrushColor = objd2.RGBToColor(0,0,0)

rt = objd2.ConvertFile(img1,img2,,haba,taka)
Set objd2 = Nothing

背景色を黒にしたいのですが、白にしかならないため、悩んでおります。
解決方法はあるのでしょうか?よろしくお願いします。
Commented by SIGNAL-9 at 2010-05-11 13:41
拙作をご利用頂きありがとうございます。
signal9@貧乏ヒマなしでブログやっているヒマもないでございます。

御照会の件ですが、残念ながら拙作にはいわゆる「レイヤー」の概念はありません(ソフトに「前景」とか「背景」という概念自体がないです)。

既存のJPEG画像の「背景色」を変更するのは不可能ではないですが、元画像の「マスク」を作って合成するという回りくどい方法しかないと思います。

サンプルプログラムの中にEfx_AppendMask.vbsというのがあるはずですが、ご参考になると思います。
Commented by えんどぅ at 2010-05-11 17:06 x
ちょっと難しそうですが、いろいろ試してみたいと思います。
ありがとうございました。
Commented by あん at 2011-04-22 18:19 x
はじめまして。
以前から、doodle2を利用させていただいます。
JPEG画像をアップロードし、その画像の縮小画像を作成させるだけの簡単なプログラムです。

この度、サーバーを変更することとなり、プログラムごと移動したのですが、縮小画像の画質が元のサーバーの画質より、だいぶ粗くなってしまいます。

プログラム内容もdllのバージョンも同じで、サーバーも引越し後のサーバーのほうが性能が良いのですが、画質が粗くなる理由で考えられることはありますか。

また、回避方法があれば教えてください。
よろしくお願いいたします。
Commented by signal-9 at 2011-04-22 18:49
あんさん、拙作を御利用頂きありがとうございます。

う~ん、「粗く」というのがよく分かりませんが、縮小のところで発生しているとすると、思いつくのは「サーバのデスクトップ画面の色数が低く設定されている」のではないかくらいです。
「粗い」というのが「色数が足りてない」現象だとすればですが。

Doodle2は縮小のロジックでは内部的に自分で色を操作しておらず素直にWindowsのAPIに任せています。つまり、そのサーバのビデオドライバ・その設定に影響を受けます。
サーバのデフォルトの画面のプロパティで色数が256色になっていたので縮小したときに色落ちした、Trueカラーにしたら直ったというご報告を以前受けたことはあります。
Commented by あん at 2011-04-27 12:44 x
お返事が遅くなって申し訳ありません。
ご回答ありがとうございます。
サーバーのビデオドライバの設定までチェックしていませんでした。
さっそくチェックしてみます。
また、ご報告しますね。
Commented by あん at 2011-05-18 14:41 x
ご報告が遅くなりました。
サーバーのデフォルト画面のプロパティを変更したら、引越し前のサーバーと同様、縮小してものきれいな画質になりました。
引越し後のサーバーの「色数が足りていなかった」ということでした。
どうもありがとうございました。
Commented by signal-9 at 2011-05-19 10:57
あんさん、改善されたようでよかったです。
わざわざご連絡有り難うございました。
Commented by ぴん at 2011-05-24 16:19 x
はじめまして。ASPにてdoodle2利用させていただいてます。

現在Win2003にて利用しているのですが、Win2008にサーバーを変更しました。
dll保存場所でC:\Windows\SysWOW64\regsvr32.exe doodle2 を実行し、登録はできたのですが、試しに下記ASPファイルを作成して実行すると、500 Internal Server Errorとなってしまいます。
何とか動作させたいのですが、何が悪いのかわかりません。
解決できる方法はありませんでしょうか?

<%
Set d = CreateObject("Doodle2.MyCanvas")
Set d = Nothing
%>

なお、dllへのアクセス権はIUSERとIIS_IUSERSに読み取りと実行を与えています。
Commented by signal-9 at 2011-05-24 18:21
ぴんさん、ご利用頂き有り難うございます。
すみませんが、お役に立てそうもないです。
Windows2008で動かしたことがないので、そもそも動くのかどうかも判りません。
また「Internal Server Error」は、色々な理由で発生しうるので、頂いた情報からだけだと何とも申し上げられません。
http://support.microsoft.com/kb/311766/ja
このあたりを参考に切り分けを行ってみたらどうでしょうか。

お役に立てず申し訳ないです。

Commented by ぴん at 2011-05-24 20:08 x
解決方法が無いとなれば、とうとうdoodle2卒業です(涙)。
色々試しましたが、時間が無いので現在違う方法でサーバーの移行を検討しています。

これまですばらしいソフトのご提供、また質問への迅速なご返答に感謝いたします。
ありがとうございました。
Commented by JUN at 2012-01-09 23:32 x
はじめまして、Doodle2使わせて頂いております。
VBSでのプログラムで描画はできないものかと頭を悩ませていたときに発見して、非常に便利で感動しております。
ありがとうございます。
今度は、どうしてこのようなことが可能なのかと興味関心がでてしまい、プログラムを勉強したいと思うようになってしまいました。プログラミングは初心者ですが、どのようなことを勉強したらいいのか御教授いただけないでしょうか。
とくに、CreateObjectでなぜ使用できるのか?DLLファイルとの関係?DLLファイルをどのように作成するのか?について興味があります。
どうかご返答よろしくお願いします。


Commented by signal-9 at 2012-01-10 10:20
JUNさん、拙作に興味を持って頂きありがとうございます。

Doodle2のようなモノを一般的には「COMコンポーネント」と呼びます。
理論・概念的な説明はwikipedia
http://ja.wikipedia.org/wiki/Component_Object_Model
などをご参照下さい。

極めて大雑把に言うと、「呼び出し方の決め事」に則った”インターフェイス”を持つことで、中身がどう作られていようが関係なく呼び出し元に対して機能を提供するという考え方で、旧来のDLLの考え方を拡張したものです。もっと簡単に言えば、従来のDLLやEXEに、COMインタフェイスという「呼び出され口」を付け加えたモノ、です。

 具体的な作り方は、「どの言語で作るか」によって<手順>は違いますので一概には言えません。JUNさんのターゲットにする「言語」での「COMの作り方」を調べてみるのがよいでしょう(Windows用の大抵の言語環境では作れますし、それ用の解説ページはあるはずです)。

ただ、ですね。.NET時代になって、すでにこの方法はちょっと古いです。今更勉強する価値があるのかどうかは個人的には疑問です。

以上、ご参考になれば幸いです。
Commented by あん at 2012-04-10 10:14 x
こんにちは。
1年程前に質問させていただいたあんです。

また質問させてください。
JPEG画像の縮小拡大に関する質問です。

例えば 80px × 50px の黒い四角いな画像があるとします。
この画像を100px × 100pxの白い四角い画像の中心に置いた画像を作成したいのです。
黒い部分の大きさはそのままにしておきたいのですが、可能でしょうか。


普通にDoodle2.Stretch(100,100,True,False)で拡大すると、画像自体は縦横比率を守って拡大され、縦側に余白がつき黒い部分も拡大される形になりますよね。


黒い部分の大きさ変えずにキャンパスサイズのみを拡大することが可能でしょうか。
もし可能であればその方法も教えて頂ければ幸いです。

以上、よろしくお願いいたします。
Commented by あん at 2012-04-10 12:15 x
できました。
Efx_AppendMask.vbs
を参考にしてやってみたらできました。
お騒がせしてすみませんでした。

また分からないことがあったらお伺いしますので、よろしくお願いします。
Commented by signal-9 at 2012-04-10 16:43
あんさん、反応できなくて申し訳ないです。
<< ふたりの永田ぼっちゃんへ。 村井宗明衆議院議員、Blogで... >>