画像のマルチページの処理 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 allgreen  (社会人) 投稿日時 2019/4/18 12:42:26
ありがとうございました
まだ、完全に解決とまではいってませんが
エラーメッセージはでなくなるところまでは進みました

ほかのサンプルなどを見てプログラムを作っていきます
完成したときには、作ったプログラムなど書き込みにきます
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/4/17 19:08:23
> 「FrameDimensionの宣言がありません」となります

VB2010 ですよね。

波線部右下の「エラー修正のオプション」を押すことで修正案が提示されますので、
提示された補正案の 1 つ目(インポート)または 2 つ目(Imaging.FrameDimension) の
いずれかの選択肢をクリックしてみてください。



このとき、3 つ目の提案(FrameDimension という名のクラスを自作)は押さないように。


> 名前空間の宣言方法というかが、わかっていないのが問題なのではないかと考えています

たとえば Graphics というクラスは、正確には
System.Drawing.Graphics という名前ですね。

System.Drawing までが Namespace(名前空間)の名称、
Graphics というのが Class(クラス)の名称です。ここまでは良いでしょうか?


しかし名前空間まで含めて記述すると
Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(canvas)
のように長くなってしまうため、名前空間を省略して
Dim g As Graphics = Graphics.FromImage(canvas)
のように書くのが一般的です。

名前空間を省略できるようにする方法は 2 つあります。
一つ目の方法は、ファイルの先頭に
 Imports System.Windows.Forms
のように宣言するというものです。これで、その名前空間を省略できるようになります。

二つ目の方法は、ファイル単位で指定するのではなく、プロジェクト単位で指定する方法です。
プロジェクトのプロパティの [参照]タブの[インポートされた名前空間]を使うこともできます。
(普段よく使われる名前空間は、既にこの方法でインポートされた状態になっています)




> Dim img As Image = Image.FromFile(filePath)

たとえば上記の場合、Image クラスが使われていますね。
Image クラスの解説はここです。
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image?view=netframework-4.0

ページの上のほうを見ると、「名前空間: System.Drawing」と書かれています。
(ついでに、アセンブリとして参照設定に「System.Drawing.dll」が必要であることも分かります)

System.Drawing 名前空間は最初からインポート済みなので、
System.Drawing.Image という長い名前ではなく、
ただの Image という短い名前で表記することができるわけです。


> Dim fd As New FrameDimension(img.FrameDimensionsList(0))

FrameDimension クラスの解説はここです。
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.imaging.framedimension?view=netframework-4.0

こちらは、「名前空間: System.Drawing.Imaging」と書かれています。
しかしこの名前空間は、初期状態ではインポートされていません。

この場合は、先の手順で名前空間「System.Drawing.Imaging」をインポートしておくか
もしくはコード側をフルネーム表記で
 Dim fd As New System.Drawing.Imaging.FrameDimension(img.FrameDimensionsList(0))
のようにすれば良いという事になります。


そしてこの訂正を自動的に行ってくれるのが、先の「修正案」ということです。

もしも修正案が提示されなかったとしても、上記の手順を踏めばコンパイルできるようになりますよ。
投稿者 (削除されました)  () 投稿日時 2019/4/17 19:02:32
(削除されました)
投稿者 allgreen  (社会人) 投稿日時 2019/4/17 17:15:31
ほかのところにあったサンプルで申し訳ないのですが
名前空間の宣言方法というかが、わかっていないのが問題なのではないかと考えています
次のサンプルの場合
たぶん、最初の3行が名前空間の追加に必要なのではと思いますが
System.Drawing と  System.Windows.Forms は、追加されているようなのでが
System.Drawing.Imaging は、追加された参照というところにでてきません
これが原因なのかは、わかりませんが
「FrameDimensionの宣言がありません」となります

何かをダウンロードするなりして、追加しなくてはいけないのでしょうか?

'Imports System.Drawing
'Imports System.Drawing.Imaging
'Imports System.Windows.Forms

'画像ファイルのパス
Dim filePath As String = "C:\test.gif"

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'画像を読み込む
Dim img As Image = Image.FromFile(filePath)
'FrameDimensionを取得する
Dim fd As New FrameDimension(img.FrameDimensionsList(0))
'フレーム数を取得する
Dim frameCount As Integer = img.GetFrameCount(fd)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/4/16 15:38:25
PDF は GDI+ でサポートされている形式では無いため、
System.Drawing 名前空間による操作は行えません。

TIFF 形式であれば、下記のようにして操作可能です。


> 今のところ、GetframeCount などを使うのだろうとやっているのですが
> framedimennsion の宣言方法などがわかりません
下記の ExtractImagesFromMultipageImage のようにすることで、個々のフレームを取り出せます。
https://dobon.net/vb/dotnet/graphics/selectactiveframe.html


逆に、複数の画像をまとめてマルチページ TIFF にしたい場合には、
下記のように記述することができます。
https://dobon.net/vb/dotnet/graphics/createmultitiff.html 
投稿者 (削除されました)  () 投稿日時 2019/4/16 15:37:13
(削除されました)
投稿者 allgreen  (社会人) 投稿日時 2019/4/16 10:23:37
マルチページのPDFやtiffのファイルの操作方法がわかりません

今のところ、GetframeCount などを使うのだろうとやっているのですが
framedimennsion の宣言方法などがわかりません

現在 Vb2010を使っています(2018年12月までVB6.0を使っていました)
シングルページのPDFやtiffのファイルは、作成・保存などできています

具体的なやりたいこと
 その1
  シングルページのPDFファイル4つを、1つの4ページのPDFファイルにしたい(これを300セット)
  001A.pdf 002A.pdf ~ 300A.pdf 001B.pdf 002B.pdf ~ 300B.pdf        
       001D.pdf 002D.pdf ~ 300D.pdf
    001A.pdf 001B.pdf 001C.pdf 001D.pdf の4つを、001.pdf にまとめたい
 その2
  これまでは、001.tif 002.tif ~ 300.tif (内容はマークシートの解答用紙です)
  これを、一つずつファイルを読み込んだりしていたのですが
 1つのマルチページのtiffファイルとして処理をやりたい

よろしくお願いします