imageに表示してある画像を保存することは可能ですか?

解決


石の間  2011-11-30 13:21:04  No: 103125  IP: 192.*.*.*

ファイルにある画像をimageに表示して、表示した画像を
指定したファイルに保存することは可能ですか?
また、可能でしたらどのようにやればいいですか?

編集 削除
Koz  2011-12-01 01:19:01  No: 103126  IP: 192.*.*.*

VB6 で手っ取り早く実装するなら、SavePicture 関数を使えばよいです。
ただし、BMP にしか対応していません。

いろんな画像形式に対応するなら GDI+ を使用すると良いかも。
「VB6 GDI+ 」で検索すると、サンプルはたくさん出てきますよ。

編集 削除
魔界の仮面弁士  2011-12-01 03:52:34  No: 103127  IP: 192.*.*.*

>> ファイルにある画像を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+ においても、「表示はできるが保存はできない」という
画像形式が幾つかある点は注意してください。

編集 削除
石の間  2011-12-06 17:30:56  No: 103128  IP: 192.*.*.*

koz様,魔界の仮面弁士様  ありがとうございます。



FileCopyじゃだめなのかということに関してですが、
今、学校の授業の一貫としてシステム開発をしていて、
その中で画像を指定したファイルに保存するという
のをやっているので、それではダメなのです。。。。

Save Picutureの関数を使ってやってみましたが、
ファイル名のところが悪いのか、保存できません。
BMPファイルでやりましたが。。。


また、GDI+というのも使ってみました。
ですが、Dim Status As GDIPlusStatusConstants  
の部分で「ユーザー定義型は定義されていません」
というエラー?が出ます。
もしかしたら、使ってるパソコンのほうに問題が
あるかもしれませんが。。。

編集 削除
魔界の仮面弁士  2011-12-06 20:44:11  No: 103129  IP: 192.*.*.*

> ですが、Dim Status As GDIPlusStatusConstants  
> の部分で「ユーザー定義型は定義されていません」

「Enum GDIPlusStatusConstants」以降のコードを書き忘れているとか。

編集 削除
魔界の仮面弁士  2011-12-06 20:50:26  No: 103130  IP: 192.*.*.*

> Save Picutureの関数を使ってやってみましたが、
Save Picuture でも
SavePicuture でもなく、
SavePicture ですね。

> ファイル名のところが悪いのか、保存できません。
具体的にはどうなってしまうのでしょうか?

実際のコードを見ていない第三者にも分かるよう、
どのようなコードで、どのようなパスに保存したのかなど、
現在の状況を分かる範囲で説明してみてください。

・エラーになってしまう(どんなエラーですか?)
・保存したはずだが、ファイルが作られない(保存先のパスは何ですか?)
・ファイルはできたが、意図しない形式になっている(どんな形式になった?)

編集 削除
石の間  2011-12-13 17:10:46  No: 103131  IP: 192.*.*.*

返事が遅くなってすみません。

GDI+の部分は解決できました。ありがとうございます!

コードは、「SavePicture Me.Image1.Picture, strFileName」
の、FileNameの部分をファイルのパスにしました。

エラーは、「引数は省略できません」と出ます。

編集 削除
Koz  2011-12-14 01:49:11  No: 103132  IP: 192.*.*.*

VB.Global.SavePicture Me.Image1.Picture, "C:\TEMP\TEST.BMP"
これで動きますかね?

プログラムのどこかに
Sub SavePicture(a, b, c)
のような定義があるのでは?

編集 削除
石の間  2011-12-15 16:57:02  No: 103133  IP: 192.*.*.*

Koz様、ありがとうございます!

上に打ってあるVB.Global.SavePicture Me.Image1.Picture, "C:\TEMP\TEST.BMP"
というのを打ってみたところ、きちんと
画像が保存されました!



あと、最近もうひとつ疑問が出てきました。

フォルダを作成するプログラムを打っていて、
既に同じ名前があった時には、もう作らなくても
いいようにするにはどうすればいいでしょうか。

もしよければ教えてほしいです!

編集 削除
Koz  2011-12-17 00:03:59  No: 103134  IP: 192.*.*.*

MakeSureDirectoryPathExists が楽チンです。

編集 削除
石の間  2011-12-19 18:44:38  No: 103135  IP: 192.*.*.*

Koz様ありがとうございます。

質問ですが、それはVB6.0でも使えますか?
また、使えるとしたら使い方を教えていただけると
助かります。

一応調べてみましたが、なかなかいい検索結果
が出ず、使えませんでした…。

初心者すぎてすみません;;

編集 削除
魔界の仮面弁士  2011-12-20 01:36:41  No: 103136  IP: 192.*.*.*

> フォルダを作成するプログラムを打っていて、
> 既に同じ名前があった時には、
同じ名前があるかどうかは、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 で検索するだけでも、十分なサンプルが見つかるようです。
ここの過去ログでも何回か登場していますしね。

編集 削除
石の間  2011-12-27 15:33:57  No: 103137  IP: 192.*.*.*

魔界の仮面弁士様、ありがとうございます。

言われたようにIf文を次のように打ってみました。

Dim strFolderName As String
strFolderName = b
  If Dir(strFolderName) <> "" Then
   MsgBox "既に存在します。"
  Else
   Call MkDir(b)
  End If

これでやってみたところ、"" Thenの前を
<>にしたら、Elseのあとの処理しかされず、
逆に、=にしてみたところ、Elseの前の
処理しかされませんでした。

何が原因なんでしょうかね…。

編集 削除
魔界の仮面弁士  2011-12-27 16:24:28  No: 103138  IP: 192.*.*.*

済みません。説明不足でした。

たとえば、"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

編集 削除
石の間  2012-01-16 16:28:43  No: 103139  IP: 192.*.*.*

ありがとうございます。

   If s = Dir("FolderName\NUL") Then
    Call MkDir(b)
   End If

このように打ってみました。
ですが、前回と同じようにDirの前を"="にしたときにしか
処理が実行されませんでした。それだけでなく、ファイルが
存在している時でも同じ処理が実行されました。
FolderNameとbにはパス名が入れてあります。


何度もすみません…。

編集 削除
魔界の仮面弁士  2012-01-16 17:56:36  No: 103140  IP: 192.*.*.*

> Dir("FolderName\NUL")
これだと、カレントドライブのカレントディレクトリの直下に
"FolerName" という名前(≠変数)のディレクトリがあるかどうかを
問い合わせることになりますね。



> ですが、前回と同じようにDirの前を"="にしたときにしか
> 処理が実行されませんでした。

s = Dir(何某)
If s <> "" Then
  MsgBox "空ではなく「" & s & "」です。"
Else
  MsgBox "空です。"
End If

の場合に、なんと表示されるのでしょうか?

編集 削除
石の間  2012-01-23 10:03:58  No: 103141  IP: 192.*.*.*

その場合はフォルダがあったとしても
Elseの部分の処理しかされませんでした。


ですが、前に言われたのを組み合わせて

   If Dir(b, vbDirectory) = "" Then
    Call MkDir(b)
   End If

打ってみたところ無事に解決できました。


Koz様,魔界の仮面弁士様,
長い間本当にありがとうございました!

編集 削除