HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0507
照坊GID+を使って画像を保存する前に保存画像のサイズを知りたいのですが?4解決


照坊

リンク

2012/5/7(Mon) 23:02:36|NO.46511

GID+を使って画像を保存する前に保存画像のファイルサイズを
知りたいと思い、色々調べたところ、GdipSaveImageToStreamを
使用するらしいのですが、これの使い方が今ひとつ分かりません。
GdipSaveImageToFileと同等で第二パラメータに保存メモリを
指定するらしいのですが上手くいきません。

これを使いたいのは、画像を読み込んでjpgで再保存する場合、
元画像のファイルサイズより大きくなるようなら再保存を
しないようにしたいのです。

どなたかGdipSaveImageToStreamの使い方を指南していただければ
ありがたいのですが、宜しくお願いします。

HSP3ラウンジに4/28に投稿したのですが、1週間経過しても一通の
レスもいただけないので、改めてこちらの皆様のご教授を頂きたく
投稿しました。m(_ _)m



この記事に返信する


暇人

リンク

2012/5/8(Tue) 02:37:12|NO.46515

ファイルに保存ができるならそこまでを貼れば
答えを考えてくれる人も増えただろうに・・・

http://www.tvg.ne.jp/menyukko/cauldron/hmimage.html
ここ見ながらやってみた

GdipSaveImageToFileと違うのはファイル名じゃなくStream化したGMを渡す所だけ

GdipSaveImageToFileはできてるの前提のサンプル


#func GdipSaveImageToStream "GdipSaveImageToStream" int, int, var, var Gsiz=640*480*4*2 GlobalAlloc GMEM_ZEROINIT , Gsiz ;GM作成 Gh = stat CreateStreamOnHGlobal Gh, 0, Sp ;GMをStream化 // GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename, GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams) // GdipSaveImageToStream(GpImage *image, IStream* stream, GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams) GdipSaveImageToStream image, Sp, CLSID, encoderParams GlobalLock Gh dupptr gp, stat, Gsiz, 2 ;固定したGMに変数名を割り当てる //gpに対しては普通にアクセスできる //これをbsaveしたらちゃんと見れた GlobalUnlock Gh //後始末 newcom cb, , -1, Sp delcom cb GlobalFree Gh
メモリに保存はできてるけど数時間前に検索して
やってみただけだから本当に合ってるかは疑問



照坊

リンク

2012/5/8(Tue) 21:59:10|NO.46538

暇人さん、早速のご教授、ありがとうございました。m(_ _)m

>> ファイルに保存ができるならそこまでを貼れば
>> 答えを考えてくれる人も増えただろうに・・・

使用したい関数名を提示すれば分かる方には分かって
いただけるだろうと…浅慮でした。(--;)
以後気をつけます。m(_ _)m

調べる中で参考サイトも見つけたのですが、使用しないと
コメントがあったのでスルーしていました。f(^^;)

ご教授いただいたスクリプトを早速組み込んで試したところ
問題なく動作しました。

感謝!感謝!です。m(_ _)m



衣日和

リンク

2012/5/9(Wed) 20:42:19|NO.46556

すでに解決されていますが、
このようなところでページが紹介されテンションあがって
モジュールをこさえてしまいました。
せっかくなので投稿(=宣伝)させてください。

; 画面イメージをJPG形式でメモリ(変数)に保存するモジュール&使用サンプル ; ImageMemorySave データを得る変数, JPG圧縮率 ; 変数はモジュール内で初期化する。圧縮率は 0〜100 の整数で。 ; 実行後のstatはデータのサイズ(Byte)。 #module JpgMemorySave #uselib "gdiplus" ;イメージ保存関連 #func GdiplusStartup "GdiplusStartup" var, var, nullptr #func GdiplusShutdown "GdiplusShutdown" int #func GdipCreateBitmapFromGdiDib "GdipCreateBitmapFromGdiDib" int, int, var #func GdipDisposeImage "GdipDisposeImage" int #func GdipSaveImageToStream "GdipSaveImageToStream" int, int, var, var ;画像を変数に保存(使ってみた) #uselib "kernel32.dll" ;グローバルメモリ関連 #func GlobalLock "GlobalLock" int #func GlobalUnlock "GlobalUnlock" int #func GlobalSize "GlobalSize" int #uselib "Ole32.dll" ;ストリーム関連 #func CreateStreamOnHGlobal "CreateStreamOnHGlobal" int, int, var ;ストリームを生成する #func GetHGlobalFromStream "GetHGlobalFromStream" int, var ;ストリームの持つグローバルメモリを取得 #deffunc ImageMemorySave array Datas, int Percent Percentage = Percent ;ポインタをわたすため、変数に代入 mref bmscr, 67 ;HSPのウィンドウ情報 ImageType = $557CF401, $11D31A04, $0000739A, $2EF31EF8 ;保存形式 JPG形式を指定する定数 SavePrm(0) = 1 ;パラメータの数 今回は圧縮率のみなので1コ SavePrm(1) = $1D5BE4B5, $452DFA4A, $B35DDD9C, $EBE70551 ;圧縮率を意味する定数 SavePrm(5) = 1 ;このパラメータの要素数? SavePrm(6) = 4 ;このパラメータの型 int型なので4 SavePrm(7) = varptr(Percentage) ;このパラメータの値を代入した変数のポインタ ; SavePrm(8) = ... ;2個目のパラメータを意味する定数から、繰り返し CreateStreamOnHGlobal 0, 1, hStrm ;グローバルメモリを使ってストリームを生成する ; p1は、グローバルメモリのハンドル (0にするとストリームが内部で生成してくれる) ; p2を、1にするとストリームの解放時にグローバルメモリも削除してくれる...らしい ; p3は、出来あがったストリームのハンドルを受け取る変数 GdipOpenPrm = 1, 0, 0, 0 ;Gdipを使用するためのおまじない GdiplusStartup hGdip, GdipOpenPrm ;hGdipにハンドルが代入される(解放処理に必要) GdipCreateBitmapFromGdiDib bmscr(6), bmscr(5), hImage ;HSPのウィンドウから画像を取得して GdipSaveImageToStream hImage, hStrm, ImageType, SavePrm ;ストリームに指定形式で保存 ; 保存に成功すればstatが0になる GdipDisposeImage hImage ;Gdipの後処理 感謝して閉じる GdiplusShutdown hGdip GetHGlobalFromStream hStrm, hGlobal ;ストリームからグローバルメモリを拝借する GlobalSize hGlobal ;グローバルメモリのサイズ(=ファイルデータのサイズ)は? DataSize = stat sdim Datas, DataSize GlobalLock hGlobal ;グローバルメモリのデータを初期化した変数にコピーする dupptr DupBuf, stat, DataSize, 2 ; GlobalLock後のstatはアドレス memcpy Datas, DupBuf, DataSize GlobalUnlock hGlobal newcom ComBuf, , -1, hStrm ;ストリームの開放は一度comにしてから delcom ComBuf ; そのcomを削除するという手続き return DataSize ;(C) 2012 衣日和 http://www.tvg.ne.jp/menyukko/ #global dialog "bmp;*.jpg;*.gif", 16, "画像ファイル" ;画像ファイルを選択する if stat == 0 : end picload refstr ImageMemorySave JPGData, 50 ;画面イメージをJPG形式でメモリに保存 FileSize = stat dialog "データサイズは " + FileSize + "[bytes]です。", 0, "保存結果" ;データチェック1 JPGフォーマットは$D8FFで始まり$D9FFで終わることを利用して ; 頭から尻尾までデータが詰まっていることを確認する。 if wpeek(JPGData, 0) != $D8FF | wpeek(JPGData, filesize - 2) != $D9FF { dialog "ファイルデータが異常です。", 1, "失敗していました。" end } ;データチェック2 ファイルとして読み込んでみる(高圧縮なほどノイズがひどい) memfile JPGData ;ちなみに、memfile + existでSizeOf()効果を得られる。 screen 1 picload "MEM:JPGdata" stop
ご存じとは思いますが
GdipSaveImageToFileは、ファイルをハードディスクなどに出力
GdipSaveImageToStreamは、ファイルをメモリに出力
する関数なので、GdipSaveImageToStreamでサイズ調査
GdipSaveImageToFileで保存とすると二度手間になってしまいます。



照坊

リンク

2012/5/10(Thu) 01:00:42|NO.46566

衣日和さん、投稿ありがとうございます。m(_ _)m

私は、この問題で色々調べる中、Visual Basicの板で、
>> MSDN を見ると、IStream_Size という API がありました。
>> どうやら、shlwapi.dll 内の無名関数のようですね。
>> 序数は 214 らしいので、こうかな。
無名関数を独自設定して取り出していましたので、hspで無名関数の
設定など出来ないなと思い、暇人さんのご教授でメモリにまでは
落とせましたので、c+でマシン語を作り、jpgのEOIを検索して
ファイルサイズを確認すると言う力技で自作アプリに組み込みました。

しかし、しかし、GlobalSize関数で取り出せるんですね!!\(^^)/
まだまだ勉強不足を痛感します…

解決済みを打ったにも拘らず、丁寧なご教授を、
本当にありがとうございました。m(_ _)m



ONION software Copyright 1997-2021(c) All rights reserved.