創作內容

4 GP

4/1,記圖之網頁程式,期望能藉此克服個人美術障礙(更新run length,部分內容有誤尚待修正)

作者:李兒諳│2018-04-01 19:05:26│巴幣:8│人氣:195
唔,我畫圖有個問題是手不穩
但我想了一下,這世界上除了我畫圖手不穩外,電腦畫圖的手也是不穩的
因此若用電腦式的畫圖法來畫圖
也許,只是也許,有機會克服自己的多媒體素材能力的問題
就像是PaintsChainer、Girl Friend Factory那樣
雖然那兩者應該是有用到機器學習,或者直接說是TensorFlow相關的東西
(機器學習有很多個框架,TensorFlow是Google主推的,日本似乎較多人採用此框架)
(也就是蠻耗伺服器計算、儲存非常大量的圖片資源的,那我就不用過於專注這方面)

這邊只簡介下電腦畫圖
在傳統點陣圖(bitmap)狀況下
都是用RGB的方式來畫
也就是
Red(紅色) 範圍 0~255
Green(綠色) 範圍 0~255
Blue(藍色) 範圍 0~255

不過若是HTML5所支援的Canvas(畫布,帆布)的話
因為支援的圖檔類型有多個PNG
因此支援RGBA的方式來畫
A就是Alpha,這邊指的是透明度
255時是完全不透明,相當於在RGB底下的狀況

傳統程式讀寫檔案那些還蠻麻煩的
不過HTML5的Javascript API大幅降低了多媒體檔的處理難度
那直接貼程式碼吧

Github
https://github.com/y541258/HTML5/blob/master/pixel_art/bitmap.html
https://github.com/y541258/HTML5/blob/master/pixel_art/bitmap_remember.html
https://github.com/y541258/HTML5/blob/master/pixel_art/bitmap_remember_run_length.html

*****************bitmap.html*****************

<!DOCTYPE html>
<meta charset="utf-8">
<html>
<body>

<canvas id="myCanvas" width="640" height="640"></canvas>
<div id="div_display"></div>

<script>
//參考網頁http://www.w3school.com.cn/tags/canvas_getimagedata.asp
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var img= new Image();
img.src="魂魄妖夢.png";
ctx.drawImage(img,0,0,img.width,img.height);
var imgData=ctx.getImageData(0,0,img.width,img.height);

for (var i=0;i<imgData.data.length;i++)
{
  if(imgData.data[i]>128)
  {
   imgData.data[i]=255;
  }
  else
  {
   imgData.data[i]=0;
  }
}
ctx.putImageData(imgData,300,0);

for (var i=0;i<imgData.data.length;i+=4)
{
  if(imgData.data[i]>128 && imgData.data[i+1]>128 && imgData.data[i+2]>128)
  {
   imgData.data[i]=255;
   imgData.data[i+1]=255;
   imgData.data[i+2]=255;
  }
  else
  {
   imgData.data[i]=0;
   imgData.data[i+1]=0;
   imgData.data[i+2]=0;
  }
}

ctx.putImageData(imgData,0,300);

var imgData=ctx.getImageData(0,0,img.width,1);
for (var i=0;i<imgData_one_line.data.length;i+=4)
{
  document.getElementById("div_display").innerHTML += imgData.data[i] + " " + imgData.data[i+1] + " " + imgData.data[i+2] +" " + imgData.data[i+3];
  document.getElementById("div_display").innerHTML += "    ";
  if(i%16==0)
      document.getElementById("div_display").innerHTML += "<br>";
}
</script>

</body>
</html>

上述該網頁效果
(這次偷懶沒用圖檔onload事件,因此可能需要重新整理才看得到網頁效果)

圖檔名就換成自己同個目錄底下的吧



****************(背誦的另一個網頁檔bitmap_remember.html)*************
<!DOCTYPE html>
<meta charset="utf-8">
<html>
<body>

<canvas id="myCanvas" width="640" height="640"></canvas>
<div id="div_display"></div>

<script>
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var img= new Image();
img.src="魂魄妖夢_黑白版.png";
ctx.drawImage(img,0,0,img.width,img.height);

var imgData=ctx.getImageData(0,0,img.width,1);
//要背第二行的話是
//var imgData=ctx.getImageData(0,1,img.width,1);

for (var i=0;i<imgData.data.length;i+=4)
{
  document.getElementById("div_display").innerHTML += imgData.data[i] + " " + imgData.data[i+1] + " " + imgData.data[i+2] +" " + imgData.data[i+3];
  document.getElementById("div_display").innerHTML += "    ";
  if(i%16==0)
      document.getElementById("div_display").innerHTML += "<br>";
}
</script>

</body>
</html>

該網頁的效果大概是這樣



不過...
目前這樣還是很不好記憶、背誦
雖然這樣是就可以記憶、背誦了
在黑白版的圖檔中
可以利用runlength的概念來處理
也就是說程式應該還可以再調整
runlength的意思就是
DDDDIINNNEEER
可以記成 D4 I2 N3 E3 R1這樣
是種非失真壓縮(無損壓縮)的常見手法
那壓縮也有助於記憶嘛
像英文的字首字根、中文的形聲字(有邊讀邊)概念那樣
有沒有覺得這程式出現的資料好像有些少?
因為這是只讀取一行的狀況下是這樣
若讀取227行(以目前的圖檔來說就是全部讀取)的話...
配上顯示網頁會有些卡住的感覺
此外也很難一次背那麼多行嘛

要背第幾行主要在這裡改
var imgData=ctx.getImageData(0,0,img.width,1);
第二行的話是
var imgData=ctx.getImageData(0,1,img.width,1);

那大概就這樣
希望可以藉此克服美術障礙與達到多媒體素材複用的目的
run length等我改天狀況比較好時再處理
(昨天戒咖啡,昨天晚上六點痛到今天下午四點好一些,雖然現在也還在痛)
雖然應該處理起來也不難才對
因此往後幾天可以期待一下

---
4/2更新,run_length(僅適用於黑白版圖片)

程式執行效果圖
因為偷懶沒做圖片onload事件偵測,一如既往滴若點開網頁檔沒反應,要再次按F5
若還是沒反應,請確認圖檔(圖檔名要完全相符)與網頁檔在同個路徑底下
不然就要從程式碼去改圖檔路徑或從圖檔名稱、圖檔路徑去修正





***bitmap_remember_run_length.html***
<!DOCTYPE html>
<meta charset="utf-8">
<html>
<body>

<canvas id="myCanvas" width="640" height="640"></canvas>
<div id="div_display"></div>

<script>
//參考網頁http://www.w3school.com.cn/tags/canvas_getimagedata.asp
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var img= new Image();
img.src="魂魄妖夢_黑白版.png";
ctx.drawImage(img,0,0,img.width,img.height);

var imgData=ctx.getImageData(0,0,img.width,img.height);
//要背第二行的話是
//var imgData=ctx.getImageData(0,1,img.width,1);

var runlength_type = null;
var runlength_num = 1;
var line_count=0;

for (var i=0;i<imgData.data.length;i+=4)
{
  line_count++;
  if(imgData.data[i]==0)
  {
   if(!runlength_type)
   {
    runlength_type = "黑";
    document.getElementById("div_display").innerHTML += "黑";
   }
   else if(runlength_type == "黑")
   {
    runlength_num++;
   }
   else if(runlength_type == "白")
   {
    document.getElementById("div_display").innerHTML += runlength_num+"黑";
    runlength_num=1;
   }
   runlength_type = "黑";
  }
  
  if(imgData.data[i]==255)
  {
   if(!runlength_type)
   {
    runlength_type = "白";
    document.getElementById("div_display").innerHTML += "白";
   }
   else if(runlength_type == "白")
   {
    runlength_num++;
   }
   else if(runlength_type == "黑")
   {
    document.getElementById("div_display").innerHTML += runlength_num+"白";
    runlength_num=1;
   }
   runlength_type = "白";
  }

  if(line_count == 242)
  {
      line_count=0;
      runlength_type = null;
      document.getElementById("div_display").innerHTML += runlength_num+"<br>";
      runlength_num = 1;
  }
}

</script>

</body>
</html>

嗯,這個圖檔太大了不太好記(242*227)
不過...
我還是試試看能否僅憑著文字來腦海生成相關圖像看看!!
看能否藉此練出對一幅圖的感覺
(這幅圖因為當初裁減的關係,所以尾巴多了道空白行,因此每列總是以白結尾的)
其實可以從程式碼,把242改成241藉此解決啦!!
(在目前的程式用這方法解決會有問題,但為何會有那問題與如何修正尚待思考中)

最後一列,第227列也有同樣問題在,也可從程式img.height-1來解決
不過我還是選擇採取用人腦忽略的方式!!
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3940421
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 2 篇留言

珀伽索斯(Ama)
看到你說這些時,讓我想到我其實畫圖的問題也很多,
但都會想辦法克服,是因為我會希望自己畫出來的圖漂亮,
最初我開始繪圖時,畫的比現在還差,但是我也是慢慢努力的想辦法改變,
也會去想怎麼樣畫圖才會變得很好,慢慢的去摸索,希望能夠愈來愈好,
雖然使用SAI這樣的繪圖軟體,但有時候成效還是會比一開始使用小畫家時期差不多,
主要是繪圖上色時手會抖的關係,也會想辦法克服這一點,
有的時候是現在播出動畫的作品,有的時候是過去的舊動畫作品,
無論如何,我都希望未來每一張都可以畫的好。[e34]

04-02 05:11

李兒諳

會用這招
代表已經放棄正常畫法了
大概也很難精進手眼協調度與手的穩定度了
(此外就算正常做法做到極致
我也頂多只能頂一人份的工作量
而且那還是理想情形
實際上要能頂一人份的工作量不知道要磨練多久)
所以想了一陣子才想著用這方法試試看04-02 16:55
珀伽索斯(Ama)
嗯嗯!我對你這裡說得就不太清楚了,
你這是說我還是說你呢!?我不太了解,
畢竟我還沒有電繪板,要畫圖使用繪圖線條的顏色時,
還是必須要靠滑鼠操控,盡量很小心的,多出來的地方還是會修,
盡量做到完好,這也是我的理想。

04-02 17:37

李兒諳
我上則回應是在說自己04-02 17:50
我要留言提醒:您尚未登入,請先登入再留言

4喜歡★y541258 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:3/30,昨天回診與精神... 後一篇:4/2,未來一週或一個月...

追蹤私訊切換新版閱覽

作品資料夾

leo25127更新至1229回
穿越奇幻日常系小說『公爵家的獨生子』更新囉,來看看我們無厘頭的ㄎ一ㄤ少爺怎麼在異世界作威作福吧!看更多我要大聲說昨天20:20


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】