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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1019
画像の切り抜き5未解決


リンク

2018/10/19(Fri) 16:54:52|NO.85610

質問です
画像を特定の範囲のみ切り抜いて描画する事は可能なのでしょうか?
可能でしたら出来れば方法を教えてくださいm(_ _)m



この記事に返信する


ゆうやん

リンク

2018/10/19(Fri) 18:46:22|NO.85611

gcopy命令を使えばいいのでは。



あらや

リンク

2018/10/19(Fri) 20:49:06|NO.85613

>画像を特定の範囲のみ切り抜いて描画する
その『範囲』とは矩形(左上と右下の座標を基準にする四角形)のことでしょうか?
矩形でしたらば、ゆうやんさんが仰ったgcopyなどほとんどの画像コピー命令で可能です。

矩形以外の範囲、いわゆる不定形な場合は
1ドット単位で処理することになるかと思います。

範囲が簡単な形状であれば計算式で(比較的)単純な処理に出来る可能性もあります。



リンク

2018/10/21(Sun) 01:41:51|NO.85628

円形です…
不定形でも簡単な形なら単純な処理で出来るとありますが出来ればその方法を教えていただきたい…!



あらや

リンク

2018/10/21(Sun) 09:05:40|NO.85630

バッファを2つ余分に使用しますが
これでどうでしょうか?


screen 0, 640, 480, 0; // 描画先スクリーン color 128, 128, 128: boxf; // わかりやすくするため、背景を灰色で塗り潰す buffer 1, 100, 100, 0; // コピー元バッファ gradf 0, 0, 100, 100, 1, 0xFF8080, 0xFF0000; // ピンクから赤へのグラデーション buffer 2, 100, 100, 0; // 処理用バッファ1 ここで描いた円が最終的にコピーするときの円形 color 255, 255, 255: boxf; // 背景を白で塗りつぶし、黒い円を描画する color 0, 0, 0: circle 0, 0, 100, 100, 1; buffer 3, 100, 100, 0; // 処理用バッファ2 // 一旦ここにコピーする pos 0, 0; gcopy 1, 0, 0, 100, 100; // 処理用バッファ1を黒透過でコピーする gmode 2: pos 0, 0; gcopy 2, 0, 0, 100, 100; // 描画先ウィンドウへ処理用バッファ2から白透過でコピーする gsel 0; pos 270, 190; // 中心にコピーする場合の座標 color 255, 255, 255: gmode 4, , , 256; // これで白透過になる gcopy 3, 0, 0, 100, 100; stop;


余計なバッファを使わず、計算で1ドットずつコピーする場合は
コピーする円の中心座標とそれぞれのドットの座標の距離を計算して
算出した距離が円の半径よりも大きければ無視、
半径以下ならコピーという形で実現できるかと思います。



とあるプログラマ

リンク

2018/10/23(Tue) 17:34:24|NO.85670

仮想イメージ上で表示して、円形の周りを無色で塗りつぶしてコピーするというゴリ押し技もあります。


randomize ;乱数初期化 #include "a2d.hsp" WINX=800 ;ウィンドウXサイズ WINY=600 ;ウィンドウYサイズ CircleSize=200 ;くり抜く円の直径(半径じゃないです) screen 0,WINX,WINY,4 title "描画元ウィンドウ" screen 1,WINX,WINY,4 title "描画先ウィンドウ" repeat 10 pos rnd(10)*WINX/12,rnd(10)*WINY/10 mes "はいけい" ;透過している(くり抜かれている)ことが分かるように背景に文字を表示 loop gsel 0 gradf 0,0,WINX,WINY,1,$FF0000,$FFFF00 ;グラデーション表示 alCreateImage 0,WINX,WINY ;仮想イメージ作成 alCopyScreenToImage 0,0 ;グラデーションを仮想イメージにコピー alEraserBrush ;無色で塗りつぶす ;ウィンドウサイズが大きい方に合わせて楕円の太さを調節 ;計算が苦手なので「なんとなく」で計算しているのでより正しい方に適宜合わせてください if WINX>=WINY { PenSize=(WINX/2+CircleSize)*sqrt(2) ;XサイズがY以上のとき }else { PenSize=(WINY/2+CircleSize)*sqrt(2) ;YサイズがX未満のとき } alPenWidth PenSize ;太さ指定 alDrawEllip (WINX/2)-CircleSize/2-Pensize/2,(WINY/2)-CircleSize/2-Pensize/2,CircleSize+PenSize,CircleSize+PenSize ;楕円描画、つまり無色で塗りつぶす ;A2Dは 枠の太さの1/2が描画開始位置です。つまり枠の太さが100で左上座標を0,0にした場合 ;-50,-50から描画し始めてX50とY50がそれぞれの内接の位置になります。 alCopyImageToScreen 0,1 ;スクリーン1にコピー redraw 1 ;redraw 1で表示



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