ファイルにある画像をimageに表示して、表示した画像を
指定したファイルに保存することは可能ですか?
また、可能でしたらどのようにやればいいですか?
VB6 で手っ取り早く実装するなら、SavePicture 関数を使えばよいです。
ただし、BMP にしか対応していません。
いろんな画像形式に対応するなら GDI+ を使用すると良いかも。
「VB6 GDI+ 」で検索すると、サンプルはたくさん出てきますよ。
>> ファイルにある画像をimageに表示して、表示した画像を
>> 指定したファイルに保存することは可能ですか?
画像の加工等が必要というわけでも無さそうですし、
ファイル→Image→別ファイルという流れであるならば、
単純に元ファイルを FileCopy すれば良い気もしますが、
それでは駄目なのでしょうか。
> VB6 で手っ取り早く実装するなら、SavePicture 関数を使えばよいです。
「SavePicture Me.Image1.Picture, strFileName」
という感じですね。
> ただし、BMP にしか対応していません。
必ずしもそうとは限らなかったりします。画像フォーマット次第ですかね。
確かに JPEGファイル等のように、BMP形式に変換されてしまうものは
多いですが、メタファイル(*.wmf等)はメタファイルのまま保存されますし、
アイコン(*.ico)もアイコン形式のまま保存されます。
ビットマップ画像にしても、基本的には元の色数を保って保存されます。
# *.RLEはどうだったっけか…?
なお、Image に表示する段階で(Pictureオブジェクト化する際に)、
BMP変換されている画像に関しては、SavePicture 結果の
ファイルの色数も、OSの画面設定に引きずられたりします。
(元のフォーマットが維持されている場合は、元ファイルの色数のまま)
すなわち最近の環境ならフルカラーで保存されるかと思いますが、
256色設定の古い Win95 機などで保存すると、保存結果も256色の
bmpになってしまうなど。(今時、256色設定のPCは使わないでしょうけれども)
> いろんな画像形式に対応するなら GDI+ を使用すると良いかも。
手前味噌ですが、Jpeg保存するサンプルです。
http://yaplog.jp/orator/archive/29
ただし、GDI+ においても、「表示はできるが保存はできない」という
画像形式が幾つかある点は注意してください。
koz様,魔界の仮面弁士様 ありがとうございます。
FileCopyじゃだめなのかということに関してですが、
今、学校の授業の一貫としてシステム開発をしていて、
その中で画像を指定したファイルに保存するという
のをやっているので、それではダメなのです。。。。
Save Picutureの関数を使ってやってみましたが、
ファイル名のところが悪いのか、保存できません。
BMPファイルでやりましたが。。。
また、GDI+というのも使ってみました。
ですが、Dim Status As GDIPlusStatusConstants
の部分で「ユーザー定義型は定義されていません」
というエラー?が出ます。
もしかしたら、使ってるパソコンのほうに問題が
あるかもしれませんが。。。
> ですが、Dim Status As GDIPlusStatusConstants
> の部分で「ユーザー定義型は定義されていません」
「Enum GDIPlusStatusConstants」以降のコードを書き忘れているとか。
> Save Picutureの関数を使ってやってみましたが、
Save Picuture でも
SavePicuture でもなく、
SavePicture ですね。
> ファイル名のところが悪いのか、保存できません。
具体的にはどうなってしまうのでしょうか?
実際のコードを見ていない第三者にも分かるよう、
どのようなコードで、どのようなパスに保存したのかなど、
現在の状況を分かる範囲で説明してみてください。
・エラーになってしまう(どんなエラーですか?)
・保存したはずだが、ファイルが作られない(保存先のパスは何ですか?)
・ファイルはできたが、意図しない形式になっている(どんな形式になった?)
返事が遅くなってすみません。
GDI+の部分は解決できました。ありがとうございます!
コードは、「SavePicture Me.Image1.Picture, strFileName」
の、FileNameの部分をファイルのパスにしました。
エラーは、「引数は省略できません」と出ます。
VB.Global.SavePicture Me.Image1.Picture, "C:\TEMP\TEST.BMP"
これで動きますかね?
プログラムのどこかに
Sub SavePicture(a, b, c)
のような定義があるのでは?
Koz様、ありがとうございます!
上に打ってあるVB.Global.SavePicture Me.Image1.Picture, "C:\TEMP\TEST.BMP"
というのを打ってみたところ、きちんと
画像が保存されました!
あと、最近もうひとつ疑問が出てきました。
フォルダを作成するプログラムを打っていて、
既に同じ名前があった時には、もう作らなくても
いいようにするにはどうすればいいでしょうか。
もしよければ教えてほしいです!
MakeSureDirectoryPathExists が楽チンです。
編集 削除Koz様ありがとうございます。
質問ですが、それはVB6.0でも使えますか?
また、使えるとしたら使い方を教えていただけると
助かります。
一応調べてみましたが、なかなかいい検索結果
が出ず、使えませんでした…。
初心者すぎてすみません;;
> フォルダを作成するプログラムを打っていて、
> 既に同じ名前があった時には、
同じ名前があるかどうかは、Dir 関数で調べられます。
たとえば、
If Dir( strFolderName ) <> "" Then
MsgBox "既に存在します。
End If
という感じです。
ただし、同じ名前があったからといって安心してはいけません。
そのパスはもしかしたら、フォルダーではなくファイルかも知れないからです。
> なかなかいい検索結果が出ず
そうですか? MakeSureDirectoryPathExists のサンプルであれば、
結構、そのものズバリが幾つか出てきましたけれども。
http://www.google.co.jp/codesearch#/
で、検索ワードに「MakeSureDirectoryPathExists」、
言語に「Basic/Visual Basic」を指定して探してみてください。
戻り値が As Long な Declare 宣言が幾つか見つかるかと思いますが
それが VB6 / VBA(32bit) 用の API 宣言です。あとはその関数を
呼び出してやれば OK かと。
まぁ、コードサーチを使わずとも、API名と「VB6」というキーワードで
google や bing で検索するだけでも、十分なサンプルが見つかるようです。
ここの過去ログでも何回か登場していますしね。
魔界の仮面弁士様、ありがとうございます。
言われたようにIf文を次のように打ってみました。
Dim strFolderName As String
strFolderName = b
If Dir(strFolderName) <> "" Then
MsgBox "既に存在します。"
Else
Call MkDir(b)
End If
これでやってみたところ、"" Thenの前を
<>にしたら、Elseのあとの処理しかされず、
逆に、=にしてみたところ、Elseの前の
処理しかされませんでした。
何が原因なんでしょうかね…。
済みません。説明不足でした。
たとえば、"C:\Program Files" というディレクトリが存在するかどうかは
s = Dir("C:\Program Files\NUL") '(1)
s = Dir("C:\Program Files" , vbDirectory) '(2)
s = Dir("C:\Program Files\", vbDirectory) '(3)
などで判定できます。存在している場合は s ≠ "" です。
ただし、システム属性や不可視属性が付いたディレクトリの場合、
(2) は空文字列になってしまう事に注意してください。追加の属性がある場合は、
s = Dir("C:\Program Files" , vbDirectory Or vbHidden)
のように、第二引数にそれらを追加指定すれば、正しく列挙されるようになります。
なお、NUL を使って (1) のように指定した場合には、属性指定をせずとも
ディレクトリの存在確認を行えます。
または、
On Error Resume Next
a = GetAttr("C:\Program Files")
If Err.Number <> 0 Then
MsgBox "存在しないか、またはアクセスできません。"
ElseIf CBool(a And vbDirectory) Then
MsgBox "これはディレクトリです。"
Else
MsgBox "これはファイルです。"
End If
On Error GoTo 0
のように、GetAttr 関数の戻り値に vbDirectory(=&H10) の
ビットフラグが付与されているかどうかで判定することもできます。
このほか、FileSystemObject の FolderExists メソッドも使えます。
If CreateObject("Scripting.FileSystemObject").FolderExists(fldr) Then
ありがとうございます。
If s = Dir("FolderName\NUL") Then
Call MkDir(b)
End If
このように打ってみました。
ですが、前回と同じようにDirの前を"="にしたときにしか
処理が実行されませんでした。それだけでなく、ファイルが
存在している時でも同じ処理が実行されました。
FolderNameとbにはパス名が入れてあります。
何度もすみません…。
> Dir("FolderName\NUL")
これだと、カレントドライブのカレントディレクトリの直下に
"FolerName" という名前(≠変数)のディレクトリがあるかどうかを
問い合わせることになりますね。
> ですが、前回と同じようにDirの前を"="にしたときにしか
> 処理が実行されませんでした。
s = Dir(何某)
If s <> "" Then
MsgBox "空ではなく「" & s & "」です。"
Else
MsgBox "空です。"
End If
の場合に、なんと表示されるのでしょうか?
その場合はフォルダがあったとしても
Elseの部分の処理しかされませんでした。
ですが、前に言われたのを組み合わせて
If Dir(b, vbDirectory) = "" Then
Call MkDir(b)
End If
打ってみたところ無事に解決できました。
Koz様,魔界の仮面弁士様,
長い間本当にありがとうございました!