内側は元のを貼り付けるだけだと思うので、太い縁を作る方法をいくつか。
A.上下左右に1〜縁幅分ずらした画像を重ねる
お手軽に太い縁になります。参照先もこれですね。
アルゴリズム的に、縦横に直線状の部分が出来ます。
また、斜め方向の縁が太くなります。
(この辺りがカットされたように見える所以かと思います)
B.縁幅を半径とする円状に画像を重ねる
Aとほぼ同様ですが、ずらして重ねる位置を円の範囲内に限定します。
縁の太さが均一となり直線状の部分も出来難いです。
但し、書体に関係無く角が丸くなります。
C.1pxずつ周囲の色を調べて拡張していく
時間が掛かる割にBとほぼ同じでした。
拡張判定のさじ加減でもう少し違うかもですが、時間対効果が覆る事は無さそうです。
D.WinAPIを利用してみる
縁取り用ではないですが、外郭をなぞるAPIで描いてみました。
結果はBと同じ様なものでした。(ちょっとジャギが出やすいかも)
APIなので高速です。
E.◆状にずらして重ねてみる
斜め方向の縁が細くなり、やや歪な感じで汎用性は低そうです。
ホラーモノなんかには向いてるかも知れません。
F.フォントファイルから文字のパスを抜き出し、各ポイントを外側へ移動した図形を得る
理想に近い形状を得られるかも知れませんが面倒過ぎてやってられません。
以下は、A〜Eの比較用サンプルです。
#define global cFontName msGothic ;フォント名
#define global cFontSize 60 ;文字サイズ
#define global cFontType 0 ;フォントスタイル
#define global cFontCol $ff8000 ;文字色
#define global cEdgeCol $0000c0 ;縁の色
#define global cFontCol2 -1
#define global cEdgeCol2 -1
#define global cGradType 3
#const global _buf 10 ;作業用バッファID
#module
#uselib "gdi32.dll"
#func _BeginPath "BeginPath" sptr
#func _EndPath "EndPath" sptr
#func _StrokePath "StrokePath" sptr
#cfunc _CreatePen "CreatePen" int,int,int
#func _SelectObject "SelectObject" sptr,sptr
#func _DeleteObject "DeleteObject" sptr
#deffunc _ef_Init int p0
;Screen _buf,gInfo.20*4,gInfo.21,8 :Title "BUF"
Buffer _buf,gInfo.20*4,gInfo.21
_tmp_=1 :gSel p0
Return
;--縁取り文字用フォント設定("FontName",Size,Style)
#deffunc ef_Font str p0, int p1, int p2, local a
If(_tmp_==0){_ef_Init gInfo.3}
a=gInfo.3 :gSel _buf :Font p0,p1*2,p2 :gSel a
Return
;--縁取り文字描画("Text",Type,EdgeW,fCol,eCol,fCol2,eCol2)
#define global ef_Mes(%1,%2=0,%3=1,%4=-1,%5=-1,%6=-1,%7=-1) _ef_Mes %1,%2,%3,%4,%5,%6,%7
#deffunc _ef_Mes str p0, int p1, int p2, int p3, int p4, int p5, int p6, local a, local b
If(_tmp_==0){_ef_Init gInfo.3} :If(p2<1){Mes p0 :Return 0}
Dim a,9 :a=p3&$ffffff,p4&$ffffff,p5&$ffffff,p6&$ffffff,p1&7,p2*2 :a.8=gInfo.3
If(p3<0){a.0=(gInfo.16<<16)|(gInfo.17)<<8|gInfo.18} :If(p4<0){a.1=a.0^$ffffff}
If(p5<0){a.2=a.0} :If(p6<0){a.3=a.1} :gSel _buf :Color :BoxF
Pos a.5,a.5 :HsvColor ,,255 :Mes p0+" " :a.6=gInfo.14+a.5*2,gInfo.15+a.5*2
If(a.4==0){ef_Mes1 a.5,a.6,a.7}
If(a.4==1){ef_Mes2 a.5,a.6,a.7}
If(a.4==2){ef_Mes3 a.5,a.6,a.7}
If(a.4==3){ef_Mes4 a.5,a.6,a.7,p0+" "}
If(a.4==4){ef_Mes5 a.5,a.6,a.7}
gMode 0 :Pos a.6/2,0 :gZoom a.6/2,a.7,_buf,0,0,a.6,a.7*2,1 :a.6=a.6/2,a.7/2
GradF 0,0,a.6,a.7,p1>>4&1,a.1,a.3 :GradF 0,a.7,a.6,a.7,p1>>3&1,a.0,a.2
gMode 7,a.6,a.7 :Pos 0,0 :gCopy _buf,0,a.7
gSel a.8 :mRef b,67 :a.0=b.35,b.33,b.34,b.65 :Dim b
gMode 7,a.6,a.7 :gCopy _buf,0,0 :gMode a.0,a.1,a.2,a.3
Return
;--上下左右に文字を重ねる
#deffunc ef_Mes1 int p0, int p1, int p2
gMode 0,p1,p2 :Pos 0,p2 :gCopy _buf :gMode 5,p1-p0,p2-p0,255
Repeat p0,1 :Pos 0,0 :gCopy _buf,cnt,p2 :Loop
Repeat p0+1 :Pos 0,p2*2 :gCopy _buf,0,cnt :Loop :Color :BoxF ,,,p2-1
Repeat 4 :Pos (cnt&1)*p0,(cnt>>1&1)*p0 :gCopy _buf,0,p2*2,p1,p2 :Loop
Return
;--円形に文字を重ねる
#deffunc ef_Mes2 int p0, int p1, int p2, local a
gMode 0,p1,p2 :Pos 0,p2 :gCopy _buf :gMode 5,p1-p0*2,p2-p0*2,255
Repeat p0+1 :a=cnt,Int(Sqrt((p0*p0)-(cnt*cnt))+0.5) :Repeat a.1*2+1,p0-a.1
Pos p0+a,cnt :gCopy _buf,p0,p0+p2
If(a){Pos p0-a,cnt :gCopy _buf,p0,p0+p2}
Loop :Loop
Return
;--1pxずつ調べて拡張
#deffunc ef_Mes3 int p0, int p1, int p2, local a, local b, local c
gMode 0,p1,p2 :Pos 0,p2 :gCopy _buf :mRef b,_buf+96
Dim a,10 :a.6=b.67,b.5+b.16,b.67*p2 :a.7-=a.8
Dim b :DupPtr b,a.7,a.8,2 :sDim c,a.8
Repeat p0 :Repeat p2 :a.1=cnt,cnt*a.6 :Repeat p1 :a.4=lPeek(b,a.2),0
a.3=(0<cnt)|((0<a.1)<<1)|(((p1-1)>cnt)<<2)|(((p2-1)>a.1)<<3)
If((a.3&3)==3){a.5+=Peek(b,a.2-a.6-3)} :If((a.3&6)==6){a.5+=Peek(b,a.2-a.6+3)}
If((a.3&9)==9){a.5+=Peek(b,a.2+a.6-3)} :If((a.3&12)==12){a.5+=Peek(b,a.2+a.6+3)}
a.5>>=1 :If(a.3&1){a.5+=Peek(b,a.2-3)} :If(a.3&2){a.5+=Peek(b,a.2-a.6)}
If(a.3&4){a.5+=Peek(b,a.2+3)} :If(a.3&8){a.5+=Peek(b,a.2+a.6)}
a.5=Limit((a.5>>1)+(a.4&$ff),0,255)
lPoke c,a.2,(a.4&$ff000000)|(a.5<<16)|(a.5<<8)|a.5 :a.2+=3
Loop :Loop :MemCpy b,c,a.8 :Loop
Return
;--APIを利用して縁取り
#deffunc ef_Mes4 int p0, int p1, int p2, str p3, local a
gMode 0,p1,p2 :Pos 0,p2 :gCopy _buf :Color :BoxF ,,,p2-1 :HsvColor ,,255
a=_CreatePen(0,p0*2,$ffffff) :_SelectObject hDC,a :a.1=stat
_BeginPath hDC :Pos p0,p0 :Mes p3 :_EndPath hDC
_StrokePath hDC :_SelectObject hDC,a.1 :_DeleteObject a
gMode 5,p1,p2,255 :Pos 0,0 :gCopy _buf,0,p2
Return
;--◆状に文字を重ねる
#deffunc ef_Mes5 int p0, int p1, int p2, local a
gMode 0,p1,p2 :Pos 0,p2 :gCopy _buf :gMode 5,p1-p0*2,p2-p0*2,255
Repeat p0+1 :a=cnt,p0-cnt :Repeat a.1*2+1,p0-a.1
Pos p0+a.0,cnt :gCopy _buf,p0,p2+p0
If(a.0){Pos p0-a.0,cnt :gCopy _buf,p0,p2+p0}
Loop :Loop
Return
#global
*start
Screen 0,,,2
ef_Font cFontName,cFontSize,cFontType
sDim sIpt,$100 :sIpt="はろ〜 World 24" :iIpt=5
Pos 4,4 :Input sIpt,496,20 :ObjSize 64,20
Pos 504,4 :Button gosub "MES",*Edge_Mes
Pos 572,4 :Input iIpt,64,20 :gSel 0,1
Stop
*Edge_Mes
gSel 0 :HsvColor ,,255 :BoxF :i=Limit(Int(iIpt),1,50)
Repeat 5
Title StrF("%dつ目描いてます",cnt+1) :aWait 1 :Pos 4,cnt*(i+cFontSize+4)+40
ef_Mes sIpt,cnt|(cGradType<<3),i,cFontCol,cEdgeCol,cFontCol2,cEdgeCol2
Redraw 1 :Redraw 0
Loop :Title "完了。"
Return
全て2倍サイズで描画し、ハーフトーンで50%に縮小しています。