-
三流君の [コンビニ系HPへ] [VBA系HPへ] [ASP系HPへ] [愚痴系HPへ]

いろいろな攻め方、攻略法(画像サイズ関係)

戻 る
サンプル→027.LZH 23KB をダウンロードして、見てください。
Excel97 VBAの処理サンプルが入っています
依頼事項?

<いろいろな攻め方、攻略法(画像サイズ関係)> 目次 1.はじめの挨拶  2.読者よりヒントメール来ました 3.BMPファイルフォーマットから攻める 4.画像をインサートして攻める 5.おわりの挨拶 ---------------------------------------------------------------------------- /* * 1.こんにちは */ こんにちは。 今回は、Excelを使用して、画像のサイズを求める、、 をやってみたいと思います。 いろいろなアプローチで攻めてみたいと思います。 意中のあの子をオトスニハ、、、 攻め方変えても、テメエじゃムリだな、、、 あっそ、、、話が変な方向に行かないうちに、始めますか? *プログラム解説より、変な話の方を期待した人、スミマセン。   三流だけど、プログラム講座なので、、、    でも、少しだけ期待にこたえて、     どんな攻め方でも、落とせれば(成功すれば)、いいんですよ。      泥臭いやり方、カッコ悪いアプローチでも、、、 /* * 2.読者よりヒントメール来ました */ じゅんねこ さんより、下記のヒントメールをいただきました。 少し感激。 どうもです。 *まだ、試していないので(消化不良なので)、そのまま、載せます。 ------- >さて、以前の[三流PG No.025] の回で、「Excel、Accessで画像のピクセル数を知る >には?」という質問がありましたね。 >で、今回、[三流PG No.026]で解決しているのかな?と思ってたら、何も記載されて >いなかったので、少し自分なりに解決方法を考えてメールを送りました。 > >一般的にVBAで扱われる画像のサイズは画像の長さやtwipsを単位としています。そこ >からピクセル数を算出することは、ディスプレイのサイズや解像度を考慮に入れる >と、どうしてもVBのScreen.TwipsPerPixcelX的な関数(プロパティ)が必要となると >思うのですが、それがない限り難しいのではないでしょうか。 > >Excel、Accessではなく、例えばVB5.0だと以下の式でピクセル数が出ると思います。 > >---> > Dim pic As StdPicture > Dim w As Integer, h As Integer > > Set pic = LoadPicture("c:/temp/sample.jpg") > '' Pictureのサイズは0.01mm単位 > '' また、1cm(100.0mm) = 567dipsなので > '' Screen.TwipsPerPixelX(Y) は 1ピクセルあたりのtwips > w = pic.Width * 567 / 1000 / Screen.TwipsPerPixelX > h = pic.Height * 567 / 1000 / Screen.TwipsPerPixelY > > MsgBox "[" & w & "," & h & "]" ><--- > >多分、この方法で間違いはないと思います。 >で、ExcelやAccessにこれを置き換えればいいですよね。 > >1.オブジェクトStdPictureを使用するためにStdOle2.Tlb(OleAutomation)を参照設定 >で追加する。 >-> もしかしたら、StdPictureにこだわらなくても、既存のコントロールで何とかな >るかもしれない。イメージコントロールとか。 > >2.オブジェクトScreenを使用するためにVB5.OLBを参照設定で追加する。 >-> VB5.OLBはVB5.0をインストールするとついてきます。 > >VB5.0は場合によっては、VB6.0になると思います。 > >ただ、この方法の難点はオブジェクトScreenを参照するためにはVB5.OLBが必要だと >いうことです。 >VBでピクセル数を算出するActiveXを作成して、それを呼び出すというのも手なので >すが、どちらにしろVB5.0の実行環境が必要になると思います。 >・・・ActiveXを利用するとか言い出したら、なんでもかんでもVBで作成すればい >いって、言われそうだ・・・。 > >もしかしたら、他にいい方法があるかもしれません。 >ちょっと僕には思い付きませんが。 ------------------- VBで作った、オブジェクトを登録して、呼んでみる。 面白そうですね。いろいろ、応用もききそうなので、 今度試してみます。 またぁ、、簡単に言っちゃう、、、ドンドン課題?増えるねぇ 講座候補として 「VBでオリジナルオブジェクト作成、Accessで使用」 ができちゃったジャン。 あっ、やってみようかな、、、と思っただけですよ(急に逃げ腰、、、) みなさん、興味ありますか? /* * 3.BMPファイルフォーマットから攻める */ BMPフォーマットのベッダ情報、から、サイズを求めてみようと思います。 bmpsize.xls を実行しながら、見てください。 下記、Excel VBA ---- Type Record 'ユーザー定義型を定義します。 BmpType As String * 2 'BM固定のハズ、、チェックで使用? BmpFileSize As Long 'ファイルサイズ、、ホントかな? BmpYOYAKU1 As Integer '固定で0? BmpYOYAKU2 As Integer '固定で0? BmpImgOff As Long 'イメージ配列までのオフセット値 BmpInfoSize As Long 'インフォ構造体のサイズ BmpWidth As Long '横幅 ピクセル BmpHeight As Long '縦幅 ピクセル BmpYOYAKU3 As Integer '固定で1? BmpEtc As String * 10 '....その他情報 End Type 'メイン処理 Sub main() Dim nYLINE As Integer Dim strCHKFILE As String nYLINE = 2 '見出しを抜かして、2行目から処理 'ファイル名が無くなるまでループ While Len(Cells(nYLINE, 2)) <> 0 'ディレクトリとファイル名をつなげて、作成 If Right(Cells(nYLINE, 1), 1) = "\" Then strCHKFILE = Cells(nYLINE, 1) & Cells(nYLINE, 2) Else strCHKFILE = Cells(nYLINE, 1) & "\" & Cells(nYLINE, 2) End If Cells(nYLINE, 3) = GetBMPSize(strCHKFILE) nYLINE = nYLINE + 1 Wend End Sub 'ファイル名を受け取り、サイズを99×99の文字列で返す 'ファイルが開けない時は、Err とする。。。 Function GetBMPSize(strFNAME As String) As String Dim MyRecord As Record Dim Position ' 変数を宣言します。 Dim FNO% If Len(Dir(strFNAME) & "") = 0 Then GetBMPSize = "ERR : File Not" Exit Function End If FNO = FreeFile ' サンプル ファイルを ランダム アクセス モードで開きます。 Open strFNAME For Random Access Read As #FNO Len = Len(MyRecord) ' Get ステートメントを使って、サンプル ファイルを読み込みます。 Position = 1 ' レコード番号を定義します。 Get #FNO, Position, MyRecord ' 1 番目のレコードを読み込みます。 Close #FNO ' ファイルを閉じます。 If MyRecord.BmpType = "BM" Then 'タイプを判断 GetBMPSize = MyRecord.BmpWidth & "×" & MyRecord.BmpHeight Else GetBMPSize = "ERR : Format Err ?" End If End Function ---- 考え方、、、BMPファイルなどの画像ファイルには、 頭に、サイズや色の数、、などの画像情報が入っていると思います。 その情報を直接読んで見ようかなぁ、、なんて、考えてみました。 BMPお嬢さんの頭の中は、なんとなく読めたのですが、 JPGお姉さんの頭は、複雑?なので、わかりませんでした。 JPGお姉さん攻略法、GIF坊、、、知りたいですね。 プログラムポイント解説 Type Record で ヘッダ情報の構造を定義 BmpType As String * 2 'BM固定のハズ、、チェックで使用? BmpFileSize As Long 'ファイルサイズ、、ホントかな? ・   ・ End Type Dim MyRecord As Record で 定義した構造の変数を作成 頭、1件だけを読み込む ----- ' サンプル ファイルを ランダム アクセス モードで開きます。 Open strFNAME For Random Access Read As #FNO Len = Len(MyRecord) ' Get ステートメントを使って、サンプル ファイルを読み込みます。 Position = 1 ' レコード番号を定義します。 Get #FNO, Position, MyRecord ' 1 番目のレコードを読み込みます。 Close #FNO ' ファイルを閉じます。 ----- 読み込んだ情報にデータが入っているはず、、、(ホントかなぁ、、) ----- If MyRecord.BmpType = "BM" Then 'タイプを判断 GetBMPSize = MyRecord.BmpWidth & "×" & MyRecord.BmpHeight Else GetBMPSize = "ERR : Format Err ?" End If ----- こんな感じで、BMPは、OKそうです。。。 いろいろ、深いので、構造など、試してください。 /* * 4.画像をインサートして攻める */ 頭の中、読もうとしても、ダメなので、 行動あるのみ?(でも、いきなり告白は、マズイでしょ、、もっとリサーチしようよ) で、 画像を実際に表示して、サイズを測ってみました。 getsize.xls を実行しながら、見てください。 下記がExcel VBA サンプルです。 ---- 'メイン処理 Sub main() Dim nYLINE As Integer Dim strCHKFILE As String nYLINE = 2 '見出しを抜かして、2行目から処理 'ファイル名が無くなるまでループ While Len(Cells(nYLINE, 2)) <> 0 'ディレクトリとファイル名をつなげて、作成 If Right(Cells(nYLINE, 1), 1) = "\" Then strCHKFILE = Cells(nYLINE, 1) & Cells(nYLINE, 2) Else strCHKFILE = Cells(nYLINE, 1) & "\" & Cells(nYLINE, 2) End If Cells(nYLINE, 3) = GetSize(strCHKFILE) nYLINE = nYLINE + 1 Wend End Sub 'ファイル名を受け取り、サイズを99×99の文字列で返す '画像ファイルを挿入し、サイズを計算する Function GetSize(strFNAME As String) As String 'ファイルの存在をチェックする If Len(Dir(strFNAME) & "") = 0 Then GetSize = "ERR : File Not" Exit Function End If 'テスト位置E6に画像ファイルを読み込む Range("E6").Select ActiveSheet.Pictures.Insert(strFNAME).Select 'Selectionって?便利? TypeNameねぇ、、、 MsgBox "選択されているオブジェクト型は" & TypeName(Selection) 'なんか違うのは、、、画面のせい??? MsgBox Selection.Width & "×" & Selection.Height 'リターン値を作成 GetSize = Selection.Width & "×" & Selection.Height '選択図形を削除、、、証拠を消す、、、 Selection.Delete End Function ---- なんか、端数が出て、合わないんだよなぁ、、、なんでだろう? これなら、JPGお姉さんもOKかと、思ったのにねぇ。。。 う〜ん。。。 /* * 5.終わりの挨拶 */ 今回、目的の処理を達成するために(達成してませんが) いろいろな方法・手段がある、、、と感じてくれれば、、、


質問や要望、クレームを送る(三流君に連絡する 連絡方法)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい

(感想や質問・要望・苦情はHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)

2000/05/13 SQL Count関数を使ってみる
2000/05/11 Access97 標準関数Midなどが使えない
2000/05/09 SendObjectのエンコード
2000/05/08 クエリーで〜以外とは
2000/04/27 Imagingコントロールを使ってみた
2000/04/25 Excel97 VBA イベントなど
2000/04/24 Access97で複数のプリンタを切替えて使用
2000/04/20 書式付きエクスポート DoCmd.OutputToで、できます
2000/04/19 Access97でExcel形式へExport時に書式設定を行いたい
2000/04/13 Access97でOutlook97/98とリンクする方法
2000/04/13 VBA Nameステートメント
2000/04/04 Accessでキー取得
2000/04/04 AccessでFile参照ダイアログ?
2000/04/03 縦書用数値変換改良
2000/04/01 Access Err テーブルを消したい
2000/03/31 縦書き数値、どうしてますか?
2000/03/29 VBA 手抜きで、処理後、explorerを開く
2000/03/28 Access --> Word へデータ
2000/03/24 名前一覧Excelの機能で、同じことできました
2000/03/23 Excel97 VBA セルに付けた名前一覧を作成する
2000/03/21 Excel セルに名前付け
2000/02/25 iniFileを読む GetPrivateProfileString
2000/02/15 Excel VBA Rangeオブジェクトとサンプル
2000/02/14 Access97 SizeMode/OLEサイズ で画像調整
2000/02/10 Access97 Pictureプロパティとサンプル
2000/02/09 Access97 集計クエリーで重複値をハジク
2000/02/07 Access97 サブフォームへ値をセット
2000/02/04 Access97 コントロールソース、チョットした使用法
2000/02/01 Access97 フォームフッター
2000/01/18 Access97 now()関数で有効期限処理、、、

←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 種類が豊富で探し易い※在庫ありが48時間以内発送


[三流君(TOP)]へ戻る。