2018年3月25日 星期日

讓extjs4使用你目前windows資源的一種方式--Cross-Origin Resource Sharing 的應用

在你的windows做一個http listener
========================================
                Thread xThread = new Thread(
                     delegate () {
                     HttpListener httpListener = new HttpListener();
                     httpListener.Prefixes.Add("http://localhost:2048/DoLocalJob/");
                     try {
                         httpListener.Start();
                     } catch (HttpListenerException hlex) {
                         Console.WriteLine(hlex);
                         return;
                     }
                     Console.WriteLine("Now ready to receive traces...");
                     while (true) {
                         var context = httpListener.GetContext(); // get te context
                         var data_text = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding).ReadToEnd();
                         Console.WriteLine("data_text is " + data_text);
                         var cleaned_data = System.Net.WebUtility.UrlDecode(data_text);
                         Console.WriteLine("clear data is " + cleaned_data);
                         Console.WriteLine("raw is " + context.Request.RawUrl);
                         byte[] buffer = Encoding.UTF8.GetBytes("OK");
                        HttpListenerResponse response = context.Response;
                        response.StatusCode = 200;
                        response.SendChunked = true;
  //如果沒有以下幾個header設定的話,Ext.Ajax.Request所收到的response都是空白的!!
                        response.ContentType = "application/json; charset=utf-8";
                        response.AppendHeader("Access-Control-Allow-Origin", "*");
                        response.AppendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                        response.AppendHeader("Access-Control-Allow-Headers", "Content-Type,x-prototype-version,x-requested-with");
                        response.ContentLength64 = buffer.Length;
                        Stream output = response.OutputStream;
                             if (context.Request.RawUrl.Contains("axn=MyAction")) {
                                 doLocalJobProcess();
                                 response.ContentLength64 = buffer.Length;
                                 output.Write(buffer, 0, buffer.Length);
                                 output.Flush();
                                 continue;
                             }
                             buffer= Encoding.ASCII.GetBytes("parameter error!!");
                             output.Write(buffer, 0, buffer.Length);
                             Console.WriteLine("send back " + cleaned_data);
                             output.Flush();
                             output.Close();
                         }
                     });
                xThread.Start();

========================================
local http server起來了,之後就是網頁的事了
=======================================
            Ext.Ajax.request({
                defaultHeaders: {
                    Accept: 'application/json',
                    'Content-Type': 'application/json'
                },
                useDefaultXhrHeader: false,
                cors: true,
                url: 'http://localhost:2048/DoLocalJob/axn=MyAction',
                method: 'POST',
                params: {
                       xxx:yyyy
                },
                timeout: 10240,
                success: function (response) {
                    if (response.responseText == 'OK') {
                         ......
                         ....
                         return;
                    }
                      //....其他錯誤....
                    return;
                },
                failure: function (response) {
                       //....http listener 沒起來,或是剛才說的header沒設好也會跑來這段
                    return;
                }
            });
===============================================

2018年3月24日 星期六

for Macbook OSX ,外接式螢幕找不到你要的解析度?試看看 「option」鍵吧

有時明明外接式螢幕可以撐到1920x1080的解析度
可是OSX只能給你1280x720,
有一個shareware(不是免費的,10天試用期)叫做「SwitchResX」的工具,可以試看看
(URL:http://www.madrau.com/ )
但,別急,如果你沒用過option鍵的話,先試看看,不行再去買switchResX
詳細參考:
https://support.apple.com/kb/PH25175?locale=zh_TW
=======================================
...
...
當您按一下「縮放」時請同時按下 Option 鍵,以顯示其他解析度供第二部顯示器使用。然後,為第二個顯示器選擇一個縮放解析度選項。
....
....
=======================================


別像我再傻傻的拔拔接接了,很難看耶......



2018年3月21日 星期三

VideoFileWriter 在 WriteVideoFrame存放畫面時居然出現「System.ArgumentException!?」

本來想玩openCV做商品辨識能力的智慧型倉儲,不過公司比較想做錄影存證,沒差,都好玩啦
不過在存放webcam的畫面進入mp4時,出現了System.ArgumentException
===========================================
using Accord.Video.FFMPEG;
using Accord.Controls;
using Accord.Video;
using Accord.Video.DirectShow;
.....
....
...
VideoFileWriter fileWriter = new VideoFileWriter();
....
private void Video_NewFrame1(object sender, NewFrameEventArgs eventArgs) {
            video = (Bitmap)eventArgs.Frame.Clone();
            picShowImg.Image = (Bitmap)eventArgs.Frame.Clone();
            if (isRecording) fileWriter.WriteVideoFrame(video);
            
 }
.....
.....
....
void bgnSaveVideo(){
                int h = 1024;
                int w = 768;
                string fileName = "d:\\" + System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".mp4";
                fileWriter.Open(fileName, w, h, 24, VideoCodec.MPEG4, 50000000);
                fileWriter.WriteVideoFrame(video);    <------這時發生錯誤!!
}
============================================
查了很久,試了好幾次才知道原因:長寬不是自己高興多少就多少,而是要看當時frame的bitmap長寬多少,才能用WriteVideoFrame
=======以下是正確的寫法========
                 int h = video.Height;
                int w = video.Width;
                string fileName = "d:\\" + System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".mp4";
                fileWriter.Open(fileName, w, h, 24, VideoCodec.MPEG4, 50000000);
                fileWriter.WriteVideoFrame(video);    <------這時就過關了!!
=============================
...
...
os:應該沒人犯這樣的錯吧.網路上一直找不到相關的案例....