-
三流君の [コンビニ系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.終わりの挨拶 */ 今回、目的の処理を達成するために(達成してませんが) いろいろな方法・手段がある、、、と感じてくれれば、、、

VBA系の無料メルマガ書いてます
メルマガ『VBAで楽しくプログラミング』(無料) を購読しませんか?
めろんぱん E-mail


...



番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)
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()関数で有効期限処理、、、

_/_/ _/_/ _/_/ _/_/ _/_/
三流君のHP主な飛び先
VBAで楽しくプログラミング 最新情報 掲示板 バックナンバー メルマガ登録と解除
コンビニのオモテとウラ話 最新情報 掲示板 バックナンバー メルマガ登録と解除
ASPで遊ぶ、失敗する 最新情報 掲示板 バックナンバー メルマガ登録と解除
AB型三流PG 業務のグチ 最新情報 掲示板 バックナンバー メルマガ登録と解除
初心者にやさしいプログラム 最新情報 掲示板 バックナンバー メルマガ登録と解除
ネットで稼ぐ本音と失敗談 最新情報 掲示板 バックナンバー
www.ken3.org(サイト内)から Google を利用して、

人気ページ/アクセスランキング
↑一週間の訪問者数と人気のページを表示してます

その他、宣伝ページです
・[ アンケート/ポイント]などで月500円を必死に稼いでます(笑)
・[ SOHO/在宅プログラマー/派遣]の話題、Webエントリー後の反応など
・[ 出会い系]のお話、自分で出会い系のシステム作れないか?探ったお話
・[ ネットで小金を稼げるか?]実験中だが成果は無し
※あとは、[パソコン関係の書籍]や[ゲームソフト]、 [パソコンパーツ] をバナーから売ろうとするけど、
 なかなかうまくはいかないよね(笑)
←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 種類が豊富で探し易い※在庫ありが48時間以内発送

プログラム系、流れや基本系?
[No.4 プログラムって?流れって?]
[No.5 変数・乱数・定数]
[No.8 配列とArray関数]
[No.9 If文で範囲のチェック]
[No.10 Select Case XX To XX と Is >= XX]
[No.11 InputBox関数で簡単な値を受け取る]
[No.12 入力結果の判断いろいろ]
[No.19 Exit Subで途中退場する]
[No.20 配列変数ですっきりと?(2次元配列)]
[No.21 変数の型を意識する]
[No.22 関数って?Subプロシージャを呼ぶ]
[No.23 値を返すユーザー関数、Function関数]
[No.24 関数のパターンを少し]
[No.35 イベント処理について]
[No.36 オブジェクトのプロパティについて]
[No.37 オブジェクトのメソッドについて]
[No.45 歌詞の表記を参考に関数を作成]
[No.73 オブジェクトのループはFor Each In でループさせる]

VBA関数
[No.3 Dir関数でファイルの存在をチェックする]
[No.17 Val関数で文字列を数値に変換してみた]
[No.18 文字列を数値に変換、CIntで変換]
[No.38 キャラクタコード?って何? Chr関数、Asc関数]
[No.39 StrConv関数で半角を全角文字にしてみた]
[No.40 Len関数で遊ぶ、遊ばれる]
[No.72 文字列を日付型に変換、Cdateへの値の渡し方いろいろ?]
[No.77 Not演算子で細工する、プログラムはパズルのように...]

Excel関係
[No.28 Excelのグラフをgifへ変換 .Exportメソッド使用]
[No.43 セルのB3を参照するには?]
[No.44 Cells(257)とCells(2,1)の関係]
[No.49 Excel Rows(n).Select で行選択]
[No.47 Excel Application.GetOpenFilenameでファイル名取得]
[No.60 Cancel=Trueの使い方(例題:Excel 右クリック禁止)]
[No.51 Excel Range オブジェクトを使う]
[No.86 Excel 起動オプションのお話(引数的なラブレターを渡したい)]

Excel UserForm
[No.30 Excel UserForm テキストボックスのイベント]
[No.32 Excel UserForm_KeyDownイベント発生条件]
[No.34 ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい]
[No.42 ExcelのForm シートと連動させる]
[No.46 カウンタで先頭行チェック、空白で終わりの判断]
[No.61 Excel Form 閉じる方法 Unload Me]
[No.63 Excel UserForm で データ・フォームの機能を真似てみる]
[No.68 Excel Formで値を設定、標準モジュールで使用したい]
[No.84 Excel UserFormでコンボボックスを使用してみた]

Access 関係
[No.1 いきなりサンプルじゃぁねぇ、、文句の一つ言いたいよ]
[No.75 空のMDBを作成後、DoCmd.CopyObjectでテーブルコピー]
[No.85 Access クエリーで演算フィールドを使ってみる]

Access フォーム
[No.41 AccessのForm .Pictureプロパティで画像参照]
[No.62 Access フォームでパスワード入力(入力後*****表示)]
[No.65 Access Form TextBoxの.SelLength .SelStartプロパティ]
[No.66 Access ユーザーマスターのチェックとメニュー切り替え]
[No.67 Access Formを隠す Me.Visible = False (Closeとの違い)]
[No.69 Access コンボボックスを自動で開きたい]

Access レポート
[No.74 Access 列型レポートの左端に印刷したい]
[No.76 Access レポート Me.NextRecord = Falseで移動を止める]

Access から Excel 連携
[No.2 AccessからExcel出力]
[No.7 MDBと同フォルダのExcelファイルを開く]
[No.13 Excel セルに名前を付けてみる]
[No.14 Excel 隣のシートを参照して逃げる]
[No.48 AccessからExcelブックを開き、書式設定を行う]
[No.54 AccessからExcel開いて、処理終了後に閉じたい]
[No.58 Access クエリーを Excel既存シートへ エクスポート]
[No.59 Excelのマクロ付きフォーマットを壊されないように]
[No.64 AccessからExcelファイルを開いて・印刷して・閉じたい]

Excel から Access 連携
[No.15 ExcelからAccessのフォームを開いてみました]
[No.16 ExcelからAccessのモジュールを呼んでみました]

テキストファイル処理
[No.27 テキストファイル処理 ファイルへの書き込み]
[No.29 テキストファイル処理 ファイルからの読み込み]
[No.31 Write #で ””を付けた書き込み]
[No.33 FreeFile関数で空いてるファイル番号を返す方法]

インターネットエクスプローラーの操作(InternetExplorer.application)
[No.50 IE起動 CreateObject("InternetExplorer.application")]
[No.52 InternetExplorer.application .document.body.innerText]
[No.53 文字列を探す、InStr関数の使い方]
[No.70 InternetExplorer.application .document.all(0).innerHTML]
[No.71 IE操作 リンク先を取出す .Document.links(i).href]

Outlookを操作する
[No.55 Outlookを操作してメールを送りたい]
[No.56 Outlookから複数のアドレスにBCC送信]
[No.57 Outlook メールアイテムの形式でハマる]
[No.78 Outlookでファイルを添付するには?.Attachments.Add]

FTPの設定ファイルを作成してみた
[No.25 コマンドラインのFTPを使ってみた]
[No.26 FTP -n オプションとuserコマンド]

Excel HTML表作成ツールもどき
[No.80 Excelのセル範囲をHTMLの表(.html)にしてみる]
[No.81 セルの右寄せ、中央寄せをHTMLの表にしてみる]
[No.82 背景色、フォントカラーをHTMLの表にしてみる]
[No.83 改行LFを<BR>などHtml用にエンコードして書き込む]

その他
[No.6 ファイルの起動場所を知る方法]
[No.79 SJIS--JISコードの文字列を作成したい]

...
挨拶
最後まで読んでいただき、どうもです。
失敗続きのAB型の変わり者 三流プログラマー Ken3です。
[Excel/Access VBA],[ ASP(Active Server Pages)]の解説
[ プログラマーの愚痴]、[ 元コンビニ店長時代の話] をネタにしてHP作成、メルマガ書いてます。
最近、[初心者にやさしいプログラム]の解説と[ ネットで稼ぐ小悪テク]の解説を始めようかなぁと思ってます。
作者に感想・質問/要望を送る(気軽に質問・感想書いてください)
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 掲示板 E-mail で受信したい
※送っていただいた質問・感想はアドレス以外、メルマガで紹介する場合があります

...