跳到主要內容

MedibangPaint-筆刷腳本

在之前Harvey就很在意"筆刷腳本"是什麼了
爬文尋找答案卻只得知筆刷腳本是由Lua程式語言編寫成的BS檔
於是將BS檔及Lua列入關鍵字詞裡
卻老是出現微軟的廣告跟BlueStacks
ㄜ...
但這些問題並沒有Harvey停下
因為Harvey還是找到了MediBangPaint的PLURK👏🙌👏
...可能Harvey之後也會加入撲浪了...


總之,Harvey找到答案了
但礙於語言上的困難,Harvey決定翻譯(Google翻譯暫定)
將來也會開始製作筆刷腳本
期待Harvey的表現😁
bs_head.png
FireAlpaca筆刷腳本規範
1. 概要
FireAlpaca可以使用腳本(Lua)和畫筆處理來執行程序控制。 通過程序控制,可以為預設準備高度自由的筆刷。 畫筆腳本使用UTF-8(不含BOM)的擴展名bs (*.bs)創建。
在創建的畫筆腳本中,
  • 放在畫筆列表窗口中
  • 從畫筆列表窗口底部的左側第三個圖標(添加(腳本))添加
您可以通過兩種方式使用它。
最簡單的腳本就是這樣。
function  main( x, y, p )

  local  r,g,b,a = bs_pixel_get( x, y )
 bs_pixel_set( x,y, 255 -r, 255 -g, 255 -b, 255  )
  return   1 
end
主(x,y,p)函數在用於繪製畫筆的鼠標或平板電腦坐標的每個頂點之間每調用1/100個增量。它會經常被調用,所以 你需要調整時間間隔 。
bs0.png
在上面的腳本中,bs_pixel_get指令獲取xy坐標的RGBA值(顏色和不透明度),並且bs_pixel_set指令用反轉的RGB值寫入像素。
如果你畫了東西,return 1,如果你沒有畫任何東西,return 0
接下來我們來看一個稍微複雜的腳本。
function  main( x, y, p )

  local  w = bs_width()
  if  w < 5   then 
   w = 5 
  end 

  if   not  firstDraw then 
    local  distance = bs_distance( lastDrawX - x, lastDrawY - y )
    if  distance < w then 
      return   0 
    end 
  end 

  local  dx,dy = bs_dir()
  local  nx,ny = bs_normal()

 bs_polygon( x + nx * w/ 3 , y + ny * w/ 3  )
 bs_polygon( x - nx * w/ 3 , y - ny * w/ 3  )
 bs_polygon( x + dx * w, y + dy * w )

  local  r,g,b = bs_fore()
 bs_fill( r,g,b, 255  )

 lastDrawX = x
 lastDrawY = y
 firstDraw = false 

  return   1 
end 

lastDrawX = 0 
lastDrawY = 0 
firstDraw = true
20100425220548.png
它會是這樣一把刷子。 我會一步一步解釋。
lastDrawX = 0 
lastDrawY = 0 
firstDraw = true
請注意最後三行。因為這是一個全球性的聲明部分,  main(x,y,p)被調用之前 的, 只有一次 總是執行。在這裡, 我們初始化變量以確定第一張圖 ,如firstDraw = true  。
local  w = bs_width()
if  w < 5   then 
 w = 5 
end
bs_width() 是獲取當前畫筆寬度(直徑)(用筆壓施加的寬度)的函數。調整為不設置5 pixel或更少的畫筆寬度。
if   not  firstDraw then 
  local  distance = bs_distance( lastDrawX - x, lastDrawY - y )
  if  distance < w then 
    return   0 
  end 
end
當它不是第一次繪圖時,如果畫筆不進行太多,我們會做一些事情,比如避免繪畫。我們用bs_distance()來測量差異距離。
local  dx,dy = bs_dir()
local  nx,ny = bs_normal()
bs_dir()是刷子行進方向的法線向量,bs_normal() 是獲取刷子行進方向法線向量的函數。法向量是量值為1的向量。我收購它是因為我需要旅行的方向。
bs1.png
bs_polygon( x + nx * w/ 3 , y + ny * w/ 3  )
bs_polygon( x - nx * w/ 3 , y - ny * w/ 3  )
bs_polygon( x + dx * w, y + dy * w )
bs_polygon() 是設置多邊形的命令。基於當前坐標值 x, y 指定在行進方向上指向的三個頂點。
bs2.png
local  r,g,b = bs_fore()
bs_fill( r,g,b, 255  )
為了獲取前台的bs_fore() 的RGB值,用這種顏色來繪製之前用bs_fill()定義的三個頂點。
我只想在中風結束時做點什麼
在所有筆劃處理結束後,調用最後一個函數。請參考這個腳本。 最後一個功能不需要執行
function  last( x, y, p )

  local  r,g,b = bs_fore()
  local  w = bs_width_max()
 bs_ellipse( x, y, w* 2 , w, 0 , r,g,b, bs_opaque()* 255  )
  return   1 
end 

function  main( x, y, p )
  return   1 
end
參數處理
function  param1()
  return   "param1" 0 100 50 
end 

function  param2()
  return   "param2" 50 100 75 
end 

function  param3()
  return   "param3" 10 20 15 
end 

function  param4()
  return   "checked" 0 1 0 
end 

function  param5()
  return   "unchecked" 0 1 1 
end
通過在腳本中定義函數 param1(), param2(), param3() ...,您可以在畫筆控制窗口中設置和獲取參數(最大10,param1 param10 )。
第一個返回值
  畫筆控件上顯示的字符(UTF8 的字符串)
第二個返回值
  設置的最小值(0到100)
第三個返回值
  它是最大設定值(0到100)
第四返回值
  設定的默認值(0至100)
設置值在腳本中,
local  param1 = bs_param1()
local  param2 = bs_param2()
local  param3 = bs_param3()
local  param4 = bs_param4()
local  param5 = bs_param5()
你可以得到的形式,如。
當最小值為0且最大值為1時,將顯示複選框 。如果選中它,則為1;如果未選中,則為0。
params.png
默認大小(寬度和最小大小)
有些畫筆推薦使用較薄的畫筆,其他畫筆推薦使用較厚的畫筆。
function  default_size()
  return   17 0.25 
end
如果您在腳本中定義了一個函數,則可以指定默認寬度和默認最小大小。在這種情況下,最大寬度為17px,最小尺寸為25%。
基點的指定
可能需要基點(參考點),例如對稱/旋轉對稱刷子。 您可以通過Ctrl(Command)指定基點並單擊畫布
您想要在腳本中使用基點的腳本,
function  use_base()
  return   true 
end
它被定義為。 設定的原點,
local  bsx,bsy = bs_base()
你可以使用bs_base()命令的形式得到它。
如果沒有指定基點, 則返回(-1,-1)。在(-1,-1)的情況下,進行特殊處理是一個好主意。
繪圖模式
在沒有指定的普通模式下,如果色彩層,你可以用你喜歡的RGB顏色繪製。但是,使用半透明繪圖時, 重疊部分會變得更暗 。它不適合平滑的刷子處理。因此,
bs_setmode( 1  )
如果您將代碼添加到初始化部件中,您將處於一種模式,可以使半透明部件的組成像常規筆那樣乾淨。但是,繪製不能用RGB任意顏色完成,它將 使用前景 顏色進行繪製
bs_setmode請務必先調用 “first”和“only once”。
  • 普通模式
bs0.png
  • 指定bs_setmode( 1 )
bs1.png
確定預覽是否正在進行中
畫筆的預覽圖像可能無法繪製(儘管在鼠標或平板電腦的情況下沒有問題)。這是使用時間信息(bs_ms())時可能發生的問題。
if  bs_preview() then 
 プレビュー時の特殊処理をここに挟む
end
就好像它一樣,你可以使用bs_preview()函數來確定是否正在進行預覽。
2. API列表(基本指令)
w = bs_width()
w = bs_width_max()
w = bs_width_min()
bs_width()
獲取應用筆壓的筆刷寬度(直徑)
bs_width_max()
獲得刷子的最大寬度(最大書寫壓力時的直徑)
bs_width_min()
獲取刷子的最小寬度(最小筆壓下的直徑)
distance = bs_distance( x, y )
rad = bs_atan( x, y )
x, y = bs_rotate( x, y, radAngle )
value = bs_grand( ave, std )
milisec = bs_ms()
num = bs_count()
bs_distance( x, y )
從原點得到(x,y)的距離
bs_atan( x, y )
從原點(x,y)得到的角度(弧度)
bs_rotate( x, y, radAngle )
x,y坐標以原點為中心,旋轉radAngle(弧度)
bs_grand( ave, sd1 )
ave在中心,然後得到的高斯分佈的隨機數的值,以適應概率的約68%在±SD1的範圍
bs_ms()
從OS啟動中獲取已過去的毫秒
bs_count()
在FireAlpaca啟動後,它將獲取畫筆腳本被調用的次數
當你想要改變每個筆劃的東西時使用它
w = bs_canvas_width()
h = bs_canvas_height()
dpi = bs_canvas_dpi()
rad = bs_canvas_angle()
bs_canvas_width()
獲取畫布的寬度
bs_canvas_height()
獲取畫布的高度
bs_canvas_dpi()
得到一個畫布dpi
bs_canvas_angle()
獲取畫布的旋轉角度(弧度角度)
r,g,b = bs_fore()
r,g,b = bs_bg()
r,g,b = bs_forebg( t )
alpha = bs_opaque()
bs_fore()
獲取前景色RGB值
bs_bg()
獲取背景顏色RGB值
bs_forebg( t )
獲取前景色和背景色的插值(0.0〜1.0)
 0.0: 背景色, 0.5:中間色, 1.0: 前景色
bs_opaque()
獲取畫筆的不透明度(0.0〜1.0)。
在畫筆控件的UI上設置的不透明度。
dx,dy = bs_dir()
nx,ny = bs_normal()
bs_dir()
 獲取刷子的行進方向矢量(法向量)
bs_normal()
 獲取從刷子的行進方向傾斜90度的矢量(法線方向)(法線矢量)
3. API列表(繪圖指令)
r,g,b,a = bs_pixel_get( x, y )
alpha = bs_pixel_get_alpha( x, y )
bs_pixel_set( x, y, r,g,b,a )
bs_pixel_get( x, y )
獲取x,y坐標的RGBA值
R,G,B,A = 0~255
1,8bpp圖層的A值始終為255
bs_pixel_get_alpha( x, y )
獲取x,y坐標的A值(不透明度/密度)
 alpha = 0~255
對於1bpp層,它是0或255
bs_pixel_set( x, y, r,g,b,a )
在x,y坐標中繪製帶有不透明度A的RGB值
 R,G,B,A = 0~255
使用bs_pixel_set繪製很多是不實際的
bs_polygon( x, y )
bs_polygon_move( dx, dy )
bs_polygon_move_center()
bs_polygon_rotate( radAngle )
bs_polygon_mul( zx, zy )
bs_polygon_clear()
rx,ry,rw,rh = bs_polygon_region()
bs_polygon( x, y )
添加頂點x,y來定義多邊形
要定義一個三角形,執行三次bs_polygon指令
bs_polygon_move( dx, dy )
將添加的多邊形的頂點移動dx,dy
bs_polygon_move_center()
將添加的多邊形的頂點移動到原點的重心
bs_polygon_rotate( radAngle )
通過原點周圍的radAngle旋轉添加的多邊形的頂點
bs_polygon_mul( zx, zy )
添加的多邊形的頂點在x方向上乘以zx,在y方向上乘zy次
bs_polygon_clear()
清除添加的多邊形(它會在bs_fill後立即自動清除)
rx,ry,rw,rh = bs_polygon_region()
獲取添加的多邊形的範圍(rx:X起點,ry:Y起點,rw:寬度,rh:高度)
  如果未設置多邊形,則沒有區域時的返回值未定義
bs_bezier_begin( x, y )
bs_bezier_c( x1, y1, x2, y2, x3, y3 )
bs_bezier_v( x2, y2, x3, y3 )
bs_bezier_y( x1, y1, x3, y3 )
bs_bezier_l( x3, y3 )
bs_bezier_m( x, y )
bs_bezier_move( dx, dy )
bs_bezier_move_center()
bs_bezier_rotate( rad )
bs_bezier_mul( zx, zy )
bs_bezier_clear()
rx,ry,rw,rh = bs_bezier_region()
bs_bezier_begin( x, y )
定義從(x,y)開始的Bezier曲線
示例代碼在這裡。 請參閱設置心形的函數set_heart。
function  param1()
  return   "interval" 10 100 50 
end 

function  set_heart( w )
 bs_bezier_begin( 0 0  )
 bs_bezier_c( - 1 , - 1 , - 0.5 , - 2 0 , - 1.3  )
 bs_bezier_c( 0.5 , - 2 1 , - 1 0 0  )
 bs_bezier_mul( w, w* 0.7  )
 bs_bezier_move_center()
end 

function  main( x, y, p )

  local  w = bs_width_max()
  if  w < 5   then 
   w = 5 
  end 

  if   not  firstDraw then 
    local  distance = bs_distance( lastDrawX - x, lastDrawY - y )
    if  distance < w* 2.0  * bs_param1()/ 100   then 
      return   0 
    end 
  end 

  local  dx,dy = bs_dir()
  local  nx,ny = bs_normal()
  local  r,g,b = bs_forebg( p )

 set_heart( w )
 bs_bezier_rotate( bs_atan( dx, dy ) )
 bs_bezier_move( x, y )
 bs_fill( r,g,b, 255  )

 lastDrawX = x
 lastDrawY = y
 firstDraw = false 

  return   1 
end 

lastDrawX = 0 
lastDrawY = 0 
firstDraw = true
heart.png
bs_bezier_c( x1, y1, x2, y2, x3, y3 )
控制點1(x1,y1)添加控制點2(x2,y2)的邊沿和下一個點(x3,y3)
bs_bezier_v( x2, y2, x3, y3 )
控制點1將當前位置,控制點2(x 2,y 2)和下一個點(x 3,y 3)相加
bs_bezier_y( x1, y1, x3, y3 )
添加控制點1(x1,y1),控制點2和下一個點(x3,y3)的邊
bs_bezier_l( x3, y3 )
添加直邊
bs_bezier_m( x, y )
創建一個新的子路徑
 遺漏部分將重疊(奇偶規則)
function  main( x, y, p )

  if   not  firstDraw then 
    local  distance = bs_distance( lastDrawX - x, lastDrawY - y )
    if  distance < 50   then 
      return   0 
    end 
  end 

  local  r,g,b = bs_fore()

  -- first path 
 bs_bezier_begin( x,y )
 bs_bezier_l( x + 100 , y )
 bs_bezier_l( x + 100 , y + 100  )
 bs_bezier_l( x, y + 100  )
 bs_bezier_l( x, y )

  -- second path 
 bs_bezier_m( x+ 10 ,y+ 10  )
 bs_bezier_l( x + 100 - 10 , y+ 10  )
 bs_bezier_l( x + 100 - 10 , y + 100 - 10  )
 bs_bezier_l( x + 10 , y + 100 - 10  )
 bs_bezier_l( x + 10 , y + 10  )

 bs_fill( r,g,b, 255  )

 lastDrawX = x
 lastDrawY = y
 firstDraw = false 

  return   1 
end 

lastDrawX = 0 
lastDrawY = 0 
firstDraw = true
bs_bezier_move( dx, dy )
移動由dx,dy添加的貝塞爾曲線
bs_bezier_move_center()
移動要添加的貝塞爾曲線的頂點並將重心移至原點
bs_bezier_rotate( rad )
旋轉由原點附近的radAngle添加的Bezier曲線的頂點
bs_bezier_mul( zx, zy )
使貝塞爾曲線的頂點在y方向上增加zx倍和x方向zy倍
bs_bezier_clear()
清除添加的路徑(它會在bs_fill後立即自動清除)
rx,ry,rw,rh = bs_bezier_region()
獲取要添加的路徑範圍(rx:X起點,ry:Y起點,rw:寬度,rh:高度)
如果路徑未設置,則沒有區域時的返回值未定義
bs_fill( r, g, b, a )
bs_fill( r, g, b, a )
  用RGBA值填充定義的多邊形·貝塞爾曲線。
 是否存在抗鋸齒取決於畫筆設置
 執行後,多邊形·貝塞爾曲線定義被清除
bs_rect( x, y, w, h, r,g,b,a )
bs_ellipse( mx, my, w, h, radAngle , r,g,b,a )
bs_rect( x, y, w, h, r,g,b,a )
  寬度高度(w,h)的矩形繪製在坐標(x,y)
bs_ellipse( mx, my, w, h, radAngle , r,g,b,a )
  在坐標(mx,my)周圍繪製寬度為高度(w,h)的橢圓(radAngle)
 是否存在抗鋸齒取決於畫筆設置
 如果是完美的圓形(w == h),它將高速繪製
bs_foot.png