|
|
2018/8/28(Tue) 10:56:40|NO.85232
先日はお世話になりました。
タイトルに書いたようにmrefの使い方なのですが、手順として
①バッファ1にpicloadで画像を読み込む
②バッファ2に1/5でバッファ1の画像を読み込む
③バッファ2の画像をbase64に変換する
書いてみたコード
#include "rsa.hsp"
buffer 1 // 画像buffer1に保存
picload"picture.png"
pic_x = ginfo_sx
pic_y = ginfo_sy
buffer 2 // 画像を1/5倍してbuffer2に保存
gzoom pic_x, pic_y, 1, 0, 0, pic_x*5, pic_y*5
screen 0
gzoom pic_x, pic_y, 1, 0, 0, pic_x*5, pic_y*5
size = (pic_x/5)*(pic_y/5)
sdim picture,size // 画像読み込み用バッファ
sdim dest,size*2 // base64用バッファ (画像バッファの2倍ほど)
mref picture, 98 // 98がたぶんバッファ2を指すと思う...
EncodeBase64 dest, picture, size
encsize=stat
bsave "base64.html",picture
問題点
・正しくbase64にならない
・バッファをたくさん使いたくはない
どなたか教えてください
|
|
2018/8/28(Tue) 12:06:44|NO.85234
EncodeBase64の仕様はわかりませんが
いくつかおかしな所があるので指摘させていただきます。
・gzoomに関して
>buffer 2 // 画像を1/5倍してbuffer2に保存
> gzoom pic_x, pic_y, 1, 0, 0, pic_x*5, pic_y*5
1/5倍にするなら
gzoom pic_x/5, pic_y/5, 1, 0, 0, pic_x, pic_y
こうではないでしょうか。
・mrefに関して
>mref picture, 98 // 98がたぶんバッファ2を指すと思う...
98がバッファ2なのはあっているのですが、
画像データを変換したいのならばBMSCRではなくVRAMの方になるので
gsel 2
mref picture, 66
こうするか、またはバッファ2を作成した直後に
buffer 2 // 画像を1/5倍してbuffer2に保存
gzoom pic_x/5, pic_y/5, 1, 0, 0, pic_x, pic_y
mref picture, 66
このようにするべきかと。
・データサイズに関して
>size = (pic_x/5)*(pic_y/5)
画像は1ドットに対して3バイトのデータ量なので
横サイズ×縦サイズ×3 にしなければいけません。
更にHSPの画像データは横幅が4の倍数になるという決まりがあるので
厳密に計算するならば
size = ((((pic_x/5) * 3) + 3) & 0xFFFFFFFC) * (pic_y/5)
こうなります。
・BASE64変換後の保存に関して
>EncodeBase64 dest, picture, size
>encsize=stat
>
>bsave "base64.html",picture
変数名から判断すると
pictureが変換前のデータ
destが変換後のデータ
と考えられるのですが、
bsaveで保存しているのは変換前のデータになっています。
bsave "base64.html",dest
こちらにしないと変換の意味がないのではないでしょうか。
|
|
2018/8/28(Tue) 16:09:46|NO.85235
#include "rsa.hsp"
screen 0 // 画像buffer0に保存
picload"picture.png"
pic_x = ginfo(10)
pic_y = ginfo(11)
size = ((((pic_x/5) * 3) + 3) & 0xFFFFFFFC) * (pic_y/5)
sdim picture,size // 画像読み込み用バッファ
sdim dest,size*2 // base64用バッファ (画像バッファの2倍ほど)
screen 1
gsel 0
mref picture, 66
EncodeBase64 dest, picture, size
encsize=stat
bsave "sumple.txt",dest,encsize
あらやさんの意見を参考に書き換えてみました。
しかし、このスクリプトでも無理でした。どこか間違っていますか?
|
|
2018/8/28(Tue) 17:03:35|NO.85236
一応変換出来ているようですが、1/5倍というのはどこへ行ったのでしょう。。。
修正するとこんな感じでしょうか。
#include "rsa.hsp"
screen 0 // 画像buffer0に保存
picload"picture.png"
;pic_x = ginfo(10) // 10だと画像だけでなくウィンドウの枠まで含めたサイズになってしまう
;pic_y = ginfo(11) // 同上
pic_x = ginfo(12) // 枠等を含まない画像のみのサイズを取得
pic_y = ginfo(13) // 同上
size = ((((pic_x/5) * 3) + 3) & 0xFFFFFFFC) * (pic_y/5)
sdim picture,size // 画像読み込み用バッファ
sdim dest,size*2 // base64用バッファ (画像バッファの2倍ほど)
;screen 1
; gsel 0
// 画像を1/5倍にする
buffer 1, pic_x/5, pic_y/5
gzoom pic_x/5, pic_y/5, 0, 0, 0, pic_x, pic_y
mref picture, 66
EncodeBase64 dest, picture, size
encsize=stat
bsave "sumple.txt",dest,encsize
これで1/5サイズで変換&保存できていると思います。
これでどこか納得がいかないのならば
VRAMデータの並び順が画像左下から始まり、
色の並びもBGRの順になっているという事が
誤解される要因かもしれません。
|
|
2018/8/28(Tue) 17:18:07|NO.85237
あらやさんどうもありがとうございます。
>>VRAMデータの並び順が画像左下から始まり、
>>色の並びもBGRの順になっているという事が
このことは初耳でした。bloadでbase64にしたものと、今回の方法でbase64にしたものを
見比べていると一致せず困っていました。
VRAMのデータが左下からということはrepeat~loop文で配列の中身を左上の順に
入れ替える処理が必要であるということですね。とにかくやってみます。
|
|
2018/8/28(Tue) 17:27:40|NO.85238
なるほど、それならばPNGファイルだと比較が難しいと思うので
BMPファイルで試してみるといいかもしれませんね。
ファイル内序盤のヘッダ情報が邪魔になりますが
BMPファイルのカラー情報自体は左下から順にBGRの並びになっていて
VRAMデータと一致するはずですので試してみてください。
|
|
2018/8/28(Tue) 21:00:36|NO.85242
手元にBMPの画像がないので後で試します。
しかし、この上下が入れ替わったbase64形式の画像を元の左上からの画像にするために
処理をしなくてはなりませんが、その場合
①入れ替えの処理をする
②1/5倍したバッファをHDDに一度保存してからbloadで読み込む
わかりにくい説明ですが、どちらの方が処理速度的に早いと思いますか?
|
|
2018/8/28(Tue) 21:29:17|NO.85243
> わかりにくい説明ですが、どちらの方が処理速度的に早いと思いますか?
一般的にハードディスクよりもメモリの方が高速ですよね。
また、HSP の mref を使って VRAM を取得していますが、
API 関数の CreateDIBSection 関数で独自に VRAM を用意します。
このときに DIB構造体の「biHeight」メンバにマイナス値をセットすると
独自の VRAM で上下逆転の座標として操作可能です。
この場合は、次のサンプルで簡単に BMP にできます。
・指定領域のビットマップ保存
https://blog.goo.ne.jp/masaki_goo_2006/e/ad7de5b1de350dfe6475d0f0a7132dc5
↑
ビットマップ形式を32ビット限定で保存します。
本当は24ビットで保存すべきでしょうが。
・ダブル・バッファリングの方法(2)
https://blog.goo.ne.jp/masaki_goo_2006/e/d2488a8e3d11aacc51524d8bd953f11f
// DIB構造体の初期化
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = +MAX_WIDTH;
bmpInfo.bmiHeader.biHeight = -MAX_HEIGHT; // マイナス値で上下逆転の座標
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
|
|
2018/8/28(Tue) 21:53:51|NO.85245
最初のソースから『PNG形式の画像をBASE64に変換してHTMLに埋め込む』というのが
目的だと判断させていただきます。
処理速度の話で言えば科学太郎さんの仰る通りになりますが、
実際にやろうとするとPNG画像の構造を詳しく知らないと実装できません。
➁の読み込んだ画像を変倍してから一旦PNG形式の画像で保存し
それを読み込んでBASE64に変換する、というのが簡単かなと思います。
|
|
2018/8/28(Tue) 21:59:42|NO.85247
科学太郎さんご親切にありがとうございます。
>>このときに DIB構造体の「biHeight」メンバにマイナス値をセットすると
>>独自の VRAM で上下逆転の座標として操作可能です。
なんとなく理解できました。しかし、
>>サンプルで簡単に BMP にできます。
で掲載されているのは見た感じC言語系ですよね?(間違っていたらすみません)
これを別ファイルで保存してhsp側からincludeして使うということですか?
知識不足ですみません。
|
|
2018/9/6(Thu) 17:29:00|NO.85301
とにかくやってみます。あらやさんもありがとうございました。
|
|