画像のマルチページの処理
投稿者 (削除されました)  ()
投稿日時
2019/4/16 15:37:13
(削除されました)
投稿者 魔界の仮面弁士  (社会人)
投稿日時
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
System.Drawing 名前空間による操作は行えません。
TIFF 形式であれば、下記のようにして操作可能です。
> 今のところ、GetframeCount などを使うのだろうとやっているのですが
> framedimennsion の宣言方法などがわかりません
下記の ExtractImagesFromMultipageImage のようにすることで、個々のフレームを取り出せます。
https://dobon.net/vb/dotnet/graphics/selectactiveframe.html
逆に、複数の画像をまとめてマルチページ TIFF にしたい場合には、
下記のように記述することができます。
https://dobon.net/vb/dotnet/graphics/createmultitiff.html
投稿者 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)
名前空間の宣言方法というかが、わかっていないのが問題なのではないかと考えています
次のサンプルの場合
たぶん、最初の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/17 19:02:32
(削除されました)
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2019/4/17 19:08:23
> 「FrameDimensionの宣言がありません」となります
VB2010 ですよね。
波線部右下の「エラー修正のオプション」を押すことで修正案が提示されますので、
提示された補正案の 1 つ目(インポート)または 2 つ目(Imaging.FrameDimension) の
いずれかの選択肢をクリックしてみてください。
このとき、3 つ目の提案(FrameDimension という名のクラスを自作)は押さないように。
> 名前空間の宣言方法というかが、わかっていないのが問題なのではないかと考えています
たとえば Graphics というクラスは、正確には
System.Drawing.Graphics という名前ですね。
System.Drawing までが Namespace(名前空間)の名称、
Graphics というのが Class(クラス)の名称です。ここまでは良いでしょうか?
しかし名前空間まで含めて記述すると
名前空間を省略できるようにする方法は 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))
のようにすれば良いという事になります。
そしてこの訂正を自動的に行ってくれるのが、先の「修正案」ということです。
もしも修正案が提示されなかったとしても、上記の手順を踏めばコンパイルできるようになりますよ。
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))
のようにすれば良いという事になります。
そしてこの訂正を自動的に行ってくれるのが、先の「修正案」ということです。
もしも修正案が提示されなかったとしても、上記の手順を踏めばコンパイルできるようになりますよ。
投稿者 allgreen  (社会人)
投稿日時
2019/4/18 12:42:26
ありがとうございました
まだ、完全に解決とまではいってませんが
エラーメッセージはでなくなるところまでは進みました
ほかのサンプルなどを見てプログラムを作っていきます
完成したときには、作ったプログラムなど書き込みにきます
まだ、完全に解決とまではいってませんが
エラーメッセージはでなくなるところまでは進みました
ほかのサンプルなどを見てプログラムを作っていきます
完成したときには、作ったプログラムなど書き込みにきます
今のところ、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ファイルとして処理をやりたい
よろしくお願いします