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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0703
フラグ神 by 初心者スクショでjpg保存のやり方を教えてください。(imgctl.dll)3解決


フラグ神 by 初心者

リンク

2022/7/3(Sun) 09:36:12|NO.96753

スクリーンショットを撮るプログラムを作っています。
今は開発途中なのですが、スクショをウィンドウid 2に置き、bmp保存かjpeg保存をしようと考えています。
今書こうとしているのがjpg保存の方です。
初心者過ぎるプログラム晒します。

#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 *menyu title "絶対スクショするマン!!" screen 0,250,400 : gsel 0, 2;ウィンドウ表示(最前面) objsize 200,75;UI制作 pos 20,20:button "スクリーンショット" , *suku pos 20,100:button "閉じる" , *owari pos 20,180:objsize 200,25:listbox a,30,"bmp\njpg\n" sdim mesb,4096 mesb = "絶対スクショするマン!!\nver1.0.0 : bmpとjpgでの保存に対応\n" pos 20,230:objsize 200,75:mesbox mesb stop *suku screen 0, 150, 50 : gsel 0, -1;ウィンドウ非表示 wait 50 sx = ginfo_dispx : sy = ginfo_dispy; デスクトップ画面のサイズでバッファ画面を作成 buffer 2, sx, sy hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); デスクトップ画面のデバイスコンテキスト取得 BitBlt hdc, 0, 0, sx, sy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT; デスクトップ画面の画像をコピー DeleteDC hdcScreen; デバイスコンテキスト削除 gsel 0, 1 : dialog "bmp", 17; ビットマップファイルとして保存 if (stat) { gsel 2 : bmpsave refstr } ;ここにjpg保存のプログラムを書きたい goto *menyu *owari end

そこで何個か調べて入力をしていたのですが、エラーになるものや、応用が利かないもの、詳しく書かれ過ぎてわからん記事が多く
何一つわからなかったです。
一応imgctl.dllを使う方向で検討をしているのですが、書き方や解説の中身が不十分でどのように書き足せばいいのかわかりません。
何か書き方のヒントやこのdllの利用できる内容など解説していただけないでしょうか?
よろしくお願いします。



この記事に返信する


沢渡

リンク

2022/7/3(Sun) 11:18:21|NO.96754

たまたま過去にimgctl.dllを使ったコードを作ったことがあるので、そこからの流用になりますが、
このような感じではどうでしょうか?
(HSPCVのcvsaveでもjpg保存はできますが、将来を考えて敢えてimgctl.dllで、ということであれば)

#uselib "gdi32.dll" #cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 //jpgで保存するためのモジュール。要imgctl.dll //jpgsave p1,p2,p3 //現在の画面の内容をp1というファイル名で保存する。 //p2は画質を1〜100で指定する。(省略可。省略時は95) //p3を0以外にするとプログレッシブjpgにする。(省略可。省略時は0) #module #uselib "imgctl.dll" #func DeleteDIB "DeleteDIB" int #cfunc DCtoDIB "DCtoDIB" int,int,int,int,int #func ImgctlErrorClear "ImgctlErrorClear" #cfunc ImgctlError "ImgctlError" #func DIBtoJPG "DIBtoJPG" sptr,int,int,int #define global jpgsave(%1,%2=95,%3=0) _jpgsave %1,%2,%3 #deffunc _jpgsave str g_fname,int qua,int prog,local hdib ImgctlErrorClear hdib=DCtoDIB(hdc,0,0,ginfo_sx,ginfo_sy) if ImgctlError() : return DIBtoJPG g_fname,hdib,limit(qua,1,100),prog!=0 DeleteDIB hdib return #global *menyu title "絶対スクショするマン!!" screen 0,250,400 : gsel 0, 2;ウィンドウ表示(最前面) objsize 200,75;UI制作 pos 20,20:button "スクリーンショット" , *suku pos 20,100:button "閉じる" , *owari pos 20,180:objsize 200,25:listbox a,30,"bmp\njpg\n" sdim mesb,4096 mesb = "絶対スクショするマン!!\nver1.0.0 : bmpとjpgでの保存に対応\n" pos 20,230:objsize 200,75:mesbox mesb stop *suku screen 0, 150, 50 : gsel 0, -1;ウィンドウ非表示 wait 50 sx = ginfo_dispx : sy = ginfo_dispy; デスクトップ画面のサイズでバッファ画面を作成 buffer 2, sx, sy hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); デスクトップ画面のデバイスコンテキスト取得 BitBlt hdc, 0, 0, sx, sy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT; デスクトップ画面の画像をコピー DeleteDC hdcScreen; デバイスコンテキスト削除 if a : s="jpg" : else : s="bmp" gsel 0, 1 : dialog s, 17; ビットマップファイルとして保存 if (stat) { gsel 2 if a { jpgsave refstr } else { bmpsave refstr } } goto *menyu *owari end



TOMATO

リンク

2022/7/3(Sun) 11:49:29|NO.96755

便乗して Artlet2D版。
追加DLLは不要で、配布時のファイル構成がちょっとだけすっきりするかと。


#include "a2d.hsp" #uselib "gdi32.dll" #cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 #module #define global jpgsave(%1,%2=0) _jpgsave %1,%2 #deffunc _jpgsave str fname, int imgId alCreateImage imgId, ginfo_winx, ginfo_winy alCopyScreenToImage ginfo_sel, imgId alSaveFile fname, "image/jpeg" alDeleteImage imgId return #global *menyu title "絶対スクショするマン!!" screen 0,250,400 : gsel 0, 2;ウィンドウ表示(最前面) objsize 200,75;UI制作 pos 20,20:button "スクリーンショット" , *suku pos 20,100:button "閉じる" , *owari pos 20,180:objsize 200,25:listbox a,30,"bmp\njpg\n" sdim mesb,4096 mesb = "絶対スクショするマン!!\nver1.0.0 : bmpとjpgでの保存に対応\n" pos 20,230:objsize 200,75:mesbox mesb stop *suku screen 0, 150, 50 : gsel 0, -1;ウィンドウ非表示 wait 50 sx = ginfo_dispx : sy = ginfo_dispy; デスクトップ画面のサイズでバッファ画面を作成 buffer 2, sx, sy hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); デスクトップ画面のデバイスコンテキスト取得 BitBlt hdc, 0, 0, sx, sy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT; デスクトップ画面の画像をコピー DeleteDC hdcScreen; デバイスコンテキスト削除 if a : s="jpg" : else : s="bmp" gsel 0, 1 : dialog s, 17; ビットマップファイルとして保存 if (stat) { gsel 2 if a { jpgsave refstr } else { bmpsave refstr } } goto *menyu *owari end



フラグ神 by 初心者

リンク

2022/7/4(Mon) 03:22:20|NO.96756

沢渡さん、TOMATOさんどちらもありがとうございます。
実際imgctl.dllを使おうと思ってたのは、将来別の保存方式を追加したくて使いたいと思っていました。
cvsaveというもの自体は知っていたのですが、どうせ追加するならと思い、今回質問させていただきました。
今のところは沢渡さんのプログラムを使う方向で考えていますが、TOMATOさんのArtlet2D版の方はすっきりしていて参考になりました。
皆さんありがとうございました。



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