|
 |
|
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

| |
|
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

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