[三流君] −−> [プログラマー業務の愚痴] −−> [バックナンバー一覧]
−−> No.027 いろいろな攻め方、攻略法(画像サイズ関係)

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


本文(発行内容)


<いろいろな攻め方、攻略法(画像サイズ関係)>
目次
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フォーマットのベッダ情報、から、サイズを求めてみようと思います。

hosoku/027/index.html
から027.LZHを落とし、
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.画像をインサートして攻める
*/
頭の中、読もうとしても、ダメなので、
行動あるのみ?(でも、いきなり告白は、マズイでしょ、、もっとリサーチしようよ)
で、
画像を実際に表示して、サイズを測ってみました。

hosoku/027/index.html
から027.LZHを落とし、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.終わりの挨拶
*/

今回、目的の処理を達成するために(達成してませんが)
いろいろな方法・手段がある、、、と感じてくれれば、、、

アドバイス(女の子を落とす方法含む)←また、女性読者減ったな確実に、、、
あったら、
気軽に掲示板に書いてください。

またまた、一言いい?
いいですよ。
実力無いヤツが、いくら彼女にアプローチしても、ダメだよ。
ギク。。。

では、また。

今日は、健康診断で採血した 三流PG Ken3でした。 *診断結果が怖いね、、

最後の捨て台詞?--- 採血で4回も注射器さしなおしやがって、、一回で決めろよ。。
          *新人さん、左でダメで右を、、もダメで左、、
            最後は、ベテランさんが強引にやり、右2回目でOK
             テメエもソフトのベテランならテスト1回で決めろよな
              はいはい。。。。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

リンクや広告など

項目別に本音?それとも建て前?的な記事をまとめました。

気になったジャンル↓を選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]