http://oshiete.goo.ne.jp/qa/8858627.html
このページでVBAのGDI+を使った8bitや24bitの画像の取扱方にについて教えていただきました。
追加の質問なのですが
画像を読み込んで画像のビット数を調べるにはどうしたら良いですか?
8bitなのか24bitなのか?
それと読み込んだ画像のdpiを取得する方法および
dpiを設定して画像を保存するにはどうしたら良いですか?
検索して調べてみましたが見つかりませんでしたので
ご助言いただけないでしょうか?
No.2ベストアンサー
- 回答日時:
#1です。
下記をお試し下さい。
Public Declare Function GdipGetImageHorizontalResolution Lib "gdiplus" (ByVal Image As Long, resolution As Single) As Long
Public Declare Function GdipGetImageVerticalResolution Lib "gdiplus" (ByVal Image As Long, resolution As Single) As Long
こちらは簡単ではなさそうな気がします。当方の良く分かっていないGDI+のGraphicsがからんできそうな気配が...
Public Declare Function GdipBitmapSetResolution Lib "gdiplus" (ByVal bitmap As Long, ByVal xdpi As Single, ByVal ydpi As Single) As Long
以上、ご参考まで。
No.4
- 回答日時:
#3の構造体、API宣言等です。
Public Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type
Public Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Public Type EncoderParameter
GUID As GUID
NumberOfValues As Long
Type As Long
Value As Long
End Type
Public Type EncoderParameters
Count As Long
Parameter(15) As EncoderParameter
End Type
Public Const CLSID_JPEG As String = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
Public Const CLSID_QUALITY As String = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
Public Declare Function GdipCreateBitmapFromFile Lib "gdiplus" _
(FileName As Any, bitmap As Long) As Long
Public Declare Function GdipCreateBitmapFromGraphics Lib "gdiplus" _
(ByVal Width As Long, ByVal Height As Long, _
ByVal Target As Long, bitmap As Long) As Long
Public Declare Function GdipDeleteGraphics Lib "gdiplus" _
(ByVal graphics As Long) As Long
Public Declare Function GdipDisposeImage Lib "gdiplus" _
(ByVal image As Long) As Long
Public Declare Function GdipDrawImageRectI Lib "gdiplus" _
(ByVal graphics As Long, ByVal image As Long, _
ByVal x As Long, ByVal y As Long, _
ByVal Width As Long, ByVal Height As Long) As Long
Public Declare Function GdipGetImageGraphicsContext Lib "gdiplus" _
(ByVal image As Long, graphics As Long) As Long
Public Declare Function GdipGetImageHeight Lib "gdiplus" _
(ByVal image As Long, Height As Long) As Long
Public Declare Function GdipGetImageWidth Lib "gdiplus" _
(ByVal image As Long, Width As Long) As Long
Public Declare Function GdipSaveImageToFile Lib "gdiplus" ( _
ByVal image As Long, _
ByVal FileName As Long, _
ByRef clsidEncoder As GUID, _
ByVal encoderParams As Any) As Long
Public Declare Sub GdiplusShutdown Lib "gdiplus" _
(ByVal token As Long)
Public Declare Function GdiplusStartup Lib "gdiplus" _
(token As Long, pInput As GdiplusStartupInput, _
pOutput As Any) As Long
Public Declare Function GdipBitmapSetResolution Lib "gdiplus" (ByVal bitmap As Long, ByVal xdpi As Single, ByVal ydpi As Single) As Long
Public Declare Function CLSIDFromString Lib "ole32.dll" ( _
ByVal lpszCLSID As Long, _
ByRef pCLSID As GUID) As Long
No.3
- 回答日時:
mitarashiです。
昔某所で教わった画像リサイズのコードを改変すると、一応dpiの変更が出来た様です。但し、Indexed画像はGraphicsが生成出来ないそうで対象になりません。構造体、APIのDeclare等は別途投稿します。
Sub changeDpi()
Dim IID_IDispatch As GUID
Dim udtInput As GdiplusStartupInput
Dim lngToken As Long, lngStatus As Long
Dim pGraphics As Long
Dim pSrcBmp As Long, pDstBmp As Long
Dim lngWidth As Long, lngHeight As Long
Dim EncodParameters As EncoderParameters
Dim srcPath As String, dstPath As String
Const jpegQuality As Long = 90
Const myDpi As Long = 300
srcPath = GetDesktopPath & "\sample1.jpg"
dstPath = GetDesktopPath & "\sample2.jpg"
' 初期化
udtInput.GdiplusVersion = 1
If GdiplusStartup(lngToken, udtInput, ByVal 0&) <> 0 Then
Exit Sub
End If
' 画像の読みこみ
If GdipCreateBitmapFromFile(ByVal StrPtr(srcPath), pSrcBmp) <> 0 Then
GdiplusShutdown lngToken
Exit Sub
End If
' 元画像サイズの取得
GdipGetImageWidth pSrcBmp, lngWidth
GdipGetImageHeight pSrcBmp, lngHeight
If GdipGetImageGraphicsContext(pSrcBmp, pGraphics) = 0 Then
' コピー先Bitmap作成
lngStatus = GdipCreateBitmapFromGraphics( _
lngWidth, lngHeight, pGraphics, pDstBmp)
'dpiの指定
lngStatus = GdipBitmapSetResolution(pDstBmp, myDpi, myDpi)
GdipDeleteGraphics pGraphics
If lngStatus = 0 Then
' コピー用Graphics作成
If GdipGetImageGraphicsContext(pDstBmp, pGraphics) = 0 Then
' イメージのコピー
GdipDrawImageRectI pGraphics, pSrcBmp, 0, 0, lngWidth, lngHeight
GdipDeleteGraphics pGraphics
' エンコーダパラメータ設定
EncodParameters.Count = 1
With EncodParameters.Parameter(0)
.GUID = ConvCLSID(CLSID_QUALITY)
.NumberOfValues = 1
' 4=EncoderParameterValueTypeLong
.Type = 4
' 圧縮品質
.Value = VarPtr(jpegQuality)
End With
' JPG変換で保存
Call GdipSaveImageToFile(pDstBmp, StrPtr(dstPath), ConvCLSID(CLSID_JPEG), VarPtr(EncodParameters))
End If
GdipDisposeImage pDstBmp
End If
End If
GdipDisposeImage pSrcBmp
GdiplusShutdown lngToken
End Sub
Private Function ConvCLSID(ByVal sGuid As String) As GUID
CLSIDFromString StrPtr(sGuid), ConvCLSID
End Function
GraphicsというのはGDI+のキャンバスの様な物で、拡大縮小回転、描画といった操作はこの上で行う必要があるそうです。.NETの説明ですが、ご参考まで。
http://msdn.microsoft.com/ja-jp/library/5y289054 …
No.1
- 回答日時:
こちらでそれらしい関数を探してみて下さい。
https://github.com/javiercrowsoft/cairo-vb6/blob …
本家のこちらもご参考になるでしょう。
http://msdn.microsoft.com/en-us/library/ms533969 …
色深度については、GdipGetImagePixelFormatを検索してみつかった下記コードで、8bitIndexedのBMPについては、"&H" & Hex(Depth) -> PixelFormat8bppIndexed = &H30803が得られました。透明が入っていると所期の結果にならないとあり、返事ももらえていない様ですが...
http://www.vbforums.com/showthread.php?718163-GD …
以上、とりあえずご参考まで。
この回答への補足
間違いました
宣言する関数は
Private Declare Function GdipGetDpiX Lib "gdiplus" (ByVal graphics As Long, dpi As Single) As Long
です。
これでうまくいかないのですがなぜでしょうか?
毎度毎度、ご回答ありがとうございます。
GdipGetImagePixelFormatの方はうまくいきました。
dpiの取得の方なのですが
Private Declare Function GdipGetImagePixelFormat Lib "gdiplus.dll" ( _
ByVal pImage As Long, _
ByRef pFormat As Long) As Long
を宣言して
Call GdipGetDpiX(hBmp, dpi_x)
で取得を試みたのですが
dpi_xの値は0になってしまいます。
どうすれば良いでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- デジタルカメラ デジカメ パソコンに画像の取り込み 2 2022/04/14 16:18
- Safari(サファリ) ポッカキット(海外のグロいのを取り扱ってるサイト)を興味本位で調べてしまいました。まだサイトには入っ 1 2022/08/17 20:27
- 教えて!goo 質問ページがエラーになるサイト 1 2022/05/29 20:12
- ノートパソコン 10年前のデスクトップPCを使ってて、結構ガタが来てます。 ノートPCか、タブレット端末で Wind 3 2023/04/23 00:06
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- ノートパソコン ノートPCか、タブレット端末で Windows11 年賀状 確定申告 インターネット プリンター ス 2 2022/07/10 22:08
- スピーカー・コンポ・ステレオ DAC[について・・・ 1 2022/08/29 11:44
- HTML・CSS トリミングで表示した画像をクリックで元どおりにしたい 3 2022/12/16 18:49
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBAにGDI+を参照させる方法
Visual Basic(VBA)
-
bmp画像をjpegやpng画像に圧縮する方法
Visual Basic(VBA)
-
8bitインデックス画像の入出力方法
Visual Basic(VBA)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの「MsgBox」について
-
手作業で埋め込んだ、UserForm1...
-
move_uploaded_fileのエラーについ
-
SQLiteに画像を格納したい
-
VBAでJPGサイズ変更
-
ckfinderの画像のアップロード先
-
データベースから検索結果に画...
-
ListViewコントロールでサムネ...
-
imagecreatetruecolor()関数で...
-
php,mysqlにて画像パス保存/表...
-
3つ以上の論理積は利用可能なの...
-
PHPのif文でその処理を途中で抜...
-
Subversionのリポジトリの削除
-
エンコーディングについて
-
FTPコマンドでディレクトリごと...
-
「クラス関数」「メンバ関数」...
-
onedrive にexcelファイルをア...
-
CFileDialogの最初のディレクト...
-
フォントの色を変えるには?
-
PHP8を使うと、大量のWarningが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの「MsgBox」について
-
透過PNGが透過されない!!
-
拡張子php画像をjpg画像等に変...
-
VBAでJPGサイズ変更
-
Illustratorで文字と画像を流し...
-
手作業で埋め込んだ、UserForm1...
-
PythonのTkinter詳しい方へ。画...
-
「imagejpeg」(GD)で作成した...
-
php,mysqlにて画像パス保存/表...
-
GDI+を使ったビット数とDPIの扱い
-
【PHP】画像が表示されず「×」...
-
PHPで吐き出した画像にリンクを...
-
ビットマップ画像を読み込むプ...
-
Macのxamppでの画像表示について
-
ListViewコントロールでサムネ...
-
Webbrowser上に表示した画像を...
-
PHPのGDライブラリについて
-
【PHP】サーバー上で TIFFをJPE...
-
GDの画像変換でサーバーに負荷
-
PHPによる画像の生成による色の...
おすすめ情報