投稿日 | 19/11/14-16:34 |
---|---|
投稿者 | schutzen |
参照先 |
こんにちは。いつもお世話になっております。
エクスプローラーでjpeg画像の詳細プロパティに表示されるタグを、プロデルから編集しようとしています。
https://social.technet.microsoft.com/Forums/scriptcenter/en-US/8b398413-0728-4a8a-a593-d2e8b92b88f2/editing-image-exif-tags?forum=ITCG などのPowerShellの例を参考に、以下のように書いてみました。
-------
ファイル文字列は=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
Imageは、dotnet_imageからインスタンスを作ったもの
imgは、dotnet_image:Fromfile(ファイル文字列)
-------
これを実行すると、3行目で次のようなエラーが出てしまいます。
-------
には、該当するコンストラクタがないためオブジェクトを作成できません。
[エラー番号900] [はじめ:32行目]
-------
そこで、少し書き直して、
-------
ファイル文字列は=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Bitmap」)を作る
imgは、dotnet_imageから「Bitmap」を{ファイル文字列}で呼び出したもの
-------
として実行してみると、次のようなエラーが返ってきました。
-------
発生した例外:
dotnet_imageから「Bitmap」を{ファイル文字列}で呼び出したもの(StaticCallExpression)
-------
インスタンス生成がうまく行っていないように思われるのですが、この場合どのように書けばよいのでしょうか。よろしくお願いいたします。
投稿日 | 19/11/15-16:31 |
---|---|
投稿者 | ゆうと |
参照先 |
こんにちは ゆうとです。
ImageクラスのFromFileメソッドは、静的メソッドですのでドットネット型の「呼び出す」手順を使って呼び出します。
次のような感じでImage型のインスタンスを作ることができます。
----------------
ファイル文字列=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
----------------
参考にして下さい。
投稿日 | 19/11/17-00:07 |
---|---|
投稿者 | schutzen |
参照先 |
ゆうとさん、早速のご返答ありがとうございます。調べてみましたら、基本的な所が理解できていなかったようで、お恥ずかしいです。
もう一つ質問よろしいでしょうか。
教えていただいた方法で生成したImage型のプロパティの取得やメソッドの呼び出しを試みています。例えば、
--------
ファイル文字列=「test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
imgから「PropertyItems」を取得する
imgから「GetPropertyItem」を{271}で呼び出す
--------
では、最後の2行が「手順が複数あり、どの手順を実行するか決定できません。」でエラーになります。
自分なりに調べたところ、Image型オブジェクト≒プロデルの画像のBaseObjectと思われたのですが、ドットネット型の「取得する」、「設定する」は使えず、Image型オブジェクトのメンバーにアクセスするコードを書く必要があるのでしょうか。
投稿日 | 19/12/26-18:09 |
---|---|
投稿者 | schutzen |
参照先 |
こんにちは。その後、Image型のプロパティ項目を編集するプラグインを作っています。
先日、アップしていただいた記事「プロデルプラグインの作り方」を参考に、Image型のラッパー種類を生成するプラグインをC#で次のように書いて、
------------------------
public class イメージ型 : ClassWarpper<Image>
{
public Image 本体
{
get { return baseObject; }
}
}
-----------------------
プロデルのこんなコードで試してみたところ
-----------------------
「ImageWrap.dll」を利用する
ファイル文字列=「test.jpg」
画像テストは、画像(ファイル文字列)を作ったもの
画像テストの本体を報告する
-----------------------
エラーとなりました。
-----------------------
『画像テストの本体』という部分で
画像型には「本体」という設定項目または手順がありません。
[エラー番号302] [はじめ:8行目]
プロデル 1.6.989 (32)
----------------------
プラグインの書き方で何か間違いがあるのでしょうか。それとも、画像ファイルを開く処理はプラグイン側に持たせた方がよいのでしょうか。よろしくご教示ください。
投稿日 | 19/12/26-22:23 |
---|---|
投稿者 | 通り道 |
参照先 |
プロデル側のプログラムを見る限り、イメージ型が登場してないように見えるのですが・・・
ファイル文字列=「test.jpg」
→ファイル文字列は、文字列型
画像テストは、画像(ファイル文字列)を作ったもの
→画像テストは、画像型
画像テストの本体を報告する
→画像型に対して、本体という名前のフィールドを参照しようとしている
これは、エラーメッセージに書かれている通り
投稿日 | 19/12/27-07:10 |
---|---|
投稿者 | schutzen |
参照先 |
通り道さん、ありがとうございます。初歩的な誤りですね、ご丁寧にご指摘いただいてすみません。「画像種類が扱われるとラッパー種類が生成される」の部分を勘違いしておりました。
そうなると、生成されたイメージ型種類はどう呼び出すのでしょうか?よろしくお願いします。
投稿日 | 19/12/27-10:05 |
---|---|
投稿者 | 通り道 |
参照先 |
Wrapperの場合、何らかの手段でラップした型のオブジェクトが生成されれば、自動的にそのWrapperClassで実装した種類として扱えます。
なので、何らかの方法でImageクラスのオブジェクトが生成できればよいです。
1つは、Pluginの中で、Imageのオブジェクトを返す手順を実装してそれを呼び出す方法。
もう1つは、ドットネット型などでImageのオブジェクトを返すメソッドを利用して取得する方法。
です。
前者で済む場合は、もともとImageを継承したPluginを作る方が楽な場合が多いと思います(シールされているクラスは除く。シールされているクラスは継承できません)
後者の場合、ラップしたPluginを作ると変換したりする手間が省けるため、ドットネット型による呼び出しと混在する場合は便利です。
Imageに限定した場合、プロデルの画像型が、System.Drawing.Bitmapへの自動変換を持っていたと思いますので、引数としてImageクラスを持つ手順を実装すれば、画像型のオブジェクトを指定することでImageクラスのオブジェクトとして受け取れるので、それをうまく利用するのも手です(System.Drawing.BitmapはImageのサブクラスです)
※自動変換(Converter)そのものは、Pluginから追加できたりはしないようです。
投稿日 | 19/12/27-23:07 |
---|---|
投稿者 | schutzen |
参照先 |
通り道さん、詳しくご回答下さり、大変ありがとうございます。
実を言うと、jpegファイルを読み込んでImageオブジェクトを返したり、逆にそれを引数にしてプロパティ項目を編集するPluginはどうにか作れてはいました。しかし、そこそこ動作するものの不意にStaticCallExpressionエラーが出るので困っておりました。ラッパー種類や画像型の自動変換を全然知らずに作ったものなので、いただいたアドバイスをもとに作り直していきたいと思います。
ありがとうございました。
投稿日 | 19/12/30-02:25 |
---|---|
投稿者 | ゆうと |
参照先 |
こんにちは ゆうとです。
議論を軽く呼んだ程度で恐縮ですが、
1.6.990でドットネット型に「変換する」手順を追加しました。
Imageクラスのような.NET Frameworkの主要なデータ型・クラスについては、プロデルが自動的に型変換する機能を持っています。ドットネット型でインスタンスを生成した場合も、メソッド,プロパティ等の戻り値が、自動的にプロデル型へ変換されるため、場合によっては扱いづらいかも知れません。
「変換する」手順では、プロデル型へ変換される前の元の型のオブジェクトを返します。
これならImageクラスのインスタンスに直接アクセスできると思います。
ただドットネット型周りの機能については、あくまでも補助的に用意しているものですので
何かの都合でバッサリ挙動が変わる可能性もあります。
C#等でプラグインとして用意する方が確実かもしれません。
--------------
Image型というドットネット型(「System.Drawing.Image」)を作る
ファイル文字列=「xxx.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
imgをImage型へ変換して画像テストとする
画像テストのPropertyItemsを報告する
[画像テスト:GetPropertyItem(20624)]を報告する
--------------
参考にして下さい。
投稿日 | 19/12/31-16:30 |
---|---|
投稿者 | schutzen |
参照先 |
ゆうとさん、こんにちは。
> 議論を軽く呼んだ程度で恐縮ですが、
> 1.6.990でドットネット型に「変換する」手順を追加しました。
いえいえ、年末のお忙しいところ大変ありがとうございます。
> ただドットネット型周りの機能については、あくまでも補助的に用意しているものですので
> 何かの都合でバッサリ挙動が変わる可能性もあります。
> C#等でプラグインとして用意する方が確実かもしれません。
プラグイン作成も進めていく予定ですが、なにぶん時間がかかりそうですので、今回のアップデートで当面の作業が進みそうです。
ちなみに、お示しいただいたサンプルに少し追加して、すんなり画像タグの表示ができました。
------------------
Image型というドットネット型(「System.Drawing.Image」)を作る
ファイル文字列=「xxxx.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
imgをImage型へ変換して画像テストとする
画像テストのPropertyItemsを報告する
itemは、画像テスト:GetPropertyItem(40094)
item_byte配列は、「{[itemのValue]}」を配列化
item_byte配列を「Unicode」という文字コードでバイナリ配列から変換したものを報告
--------------------
また来年もよろしくお願いいたします。
- WebForum -