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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0828
イナウサmref の使い方10解決


イナウサ

リンク

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

とにかくやってみます。あらやさんもありがとうございました。



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