PIXNET Logo登入

Y CP的部落格

跳到主文

歡迎光臨Y CP在痞客邦的小天地

部落格全站分類:不設分類

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 8月 16 週一 201013:21
  • 圖片格式 gif, jpg, png

以下全部複製從  這裡   這裡
 
Gif格式特點

  • 透明性:


    Gif是一種布爾透明類型,既它可以是全透明,也可以是全不透明,但是它並沒有半透明(alpha 透明)。



  • 動畫:


    Gif這種格式支持動畫。



  • 無損耗性:


    Gif是一種無損耗的圖像格式,這也意味著你可以對gif圖片做任何操作也不會使  得圖像質量產生損耗。



  • 水平掃瞄:


    Gif是使用了一種叫作LZW的算法進行壓縮的,當壓縮gif的過程中,像素是由上到下水平壓縮的,這也意味著同等條件下,橫向的gif圖片比豎向的gif圖片更加小。例如500*10的圖片比10*500的圖片更加小



  • 間隔漸進顯示:


    Gif支持可選擇性的間隔漸進顯示


  • 由以上特點看出只有256種顏色的gif圖片不適合照片,但它適合對顏色要求不高的圖形(比如說圖標,圖表等),它並不是最優的選擇,我們會在後面中看到png是最優的選擇。
    Jpeg格式特點

  • 透明性:


    它並不支持透明。



  • 動畫:


    它也不支持動畫。



  • 損耗性:


    除了一些比如說旋轉(僅僅是90、180、270度旋轉),裁切,從標準類型到先進類型,編輯圖片的原數據之外,所有其它操作對jpeg圖像的處理都會使得它的質量損失。所以我們在編輯過程一般用png作為過渡格式。



  • 隔行漸進顯示:


    它支持隔行漸進顯示(但是ie瀏覽器並不支持這個屬性,但是ie會在整個圖像信息完全到達的時候顯示)。


  • 由上可以看出Jpeg是最適web上面的攝影圖片和數字照相機中。
    Png格式特點
  • 類型:
    Png這種圖片格式包括了許多子類,但是在實踐中大致可以分為256色的png和全色的png,你完成可以用256色的png代替gif,用全色的png 代替jpeg

  • 透明性:
    Png是完全支持alpha透明的(透明,半透明,不透明),儘管有兩個怪異的現象在ie6(下面詳細討論)

  • 動畫:
    它不支持動畫

  • 無損耗性:
    png是一種無損耗的圖像格式,這也意味著你可以對png圖片做任何操作也不會使  得圖像質量產生損耗。這也使得png可以作為jpeg編輯的過渡格式

  • 水平掃瞄:
    像GIF一樣,png也是水平掃瞄的,這樣意味著水平重複顏色比垂直重複顏色的圖片更小

  • 間隔漸進顯示:
    它支持間隔漸進顯示,但是會造成圖片大小變得更大

  • 更多關於PNG
  • PNG8
    256色PNG的別名

  • PNG24
    全色PNG的別名

  • PNG32
    全色PNG的別名
    其它圖片格式與PNG比較

  • 眾所周知GIF適合圖形,JPEG適合照片,PNG系列兩種都適合。

  • 相比GIF
    PNG 8除了不支持動畫外,PNG8有GIF所有的特點,但是比GIF更加具有優勢的是它支持alpha透明和更優的壓縮。所以,大多數情況下,你都應該用 PNG8不是GIF(除了非常小的圖片GIF會有更好的壓縮外)。

  • 相比JPEG
    JPEG比全色PNG具有更加好的壓縮,因此也使得JPEG適合照片,但是編輯JPEG過程中容易造成質量的損失,所以全色PNG適合作為編輯JPEG的過渡格式.

  • Png8的在ie中的怪異表現:
  • 半透明的png8在ie6以下的瀏覽器顯示為全透明。
    Alpha透明的全色PNG(png32)在ie6中會出現背景顏色(通常是灰色)。

  • 由上面可以總結:
    (a)全透明的png8可以在任一瀏覽器正常顯示(就像gif一樣)。半透明的png8在除了ie6及其以下的瀏覽器下錯誤的顯示成全透明,其它瀏覽器都能正常顯示半透明。這個bug並不需要特殊對待,因為在不支持半透明的瀏覽器下只是顯示為全透明,對用戶體驗影響不大,它反而是透明gif的加強版。
    (b)第二個bug沒有什麼好的方法解決,只能通過影響性能的方法AlphaImageLoader與需要加特殊標籤(VML)。

  • 因此得出結論就是:請使用PNG8。


    Png8的軟件問題:
  • Photoshop只能導出布爾透明的PNG8。

  • Fireworks既能導出布爾透明的PNG8,也能導出alpha透明的PNG8。

  • pngquant與pngnq這兩個命令行軟件可以轉換全色png為256色的png8。
  • (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(325)

    • 個人分類:
    ▲top
    • 5月 18 週二 201012:09
    • C關鍵字 volatile, restrict

    參考出處: volatile  1  2
     
    compiler 的最佳化編譯,為了增快程式速度,
    有時候會很聰明的將程式碼編譯成和原 code 不同,但意思相同的 object code
    如下:
    for (int i = 0; i < 10000; i++) {
        a = 5;
       a =  a * i;
    }
    compiler 可以簡化成下列一條敘述:
    a = 5 * 9999;
    編譯器最佳化,就讓程式變得更有效率。
     
    但是當我們某些程式片段不希望做最佳化的時候呢? 就要使用 volatile 關鍵字
    volatile 是 C 的關鍵字,用來修飾資料型態,是告訴 compiler 不要對這一個變數的程式碼區段做最佳化。
    通常是用在有 multiple threads without using the lock Statement 的時候,
    因為這個變數值有可能常常會被外在 routine 改變(在kernel裡面通常是指 interrupt handler )
    舉例來說
    Volatile char wait;
    void xxx(void){
      wait=1;
      while (wait==0);
      .....
      .....
    }
    void timer0(void) interrupt 1{
      wait=0;
      .......
    }
    xxx() 中就是等一個 timer 中斷才會執行底下的工作
    如果不寫 Volatile 會被編譯器省略掉,因為 wait=1,來 wait  會等於 0
    restrict 是 C 的關鍵字,只能用來修飾 pointer,目的是協助 compiler 做最佳化
    是告知 compiler ,這一個 restrict pointer 是唯一指向 data 的 pointer,
    意即程式當中不會透過其他變數 ( pointer,或者直接存取 ) 來 access 此 data,
    例子如下:
    int * restrict rptr = (int*) malloc(10*sizeof(int));
    int a[10];
    int * ptr;
    ptr = a;
    for(int i =0; i<10;i++) { 
        ptr += 5;
        rptr +=5;
        a *= 5;
        ptr += 3;
        rptr += 3;
    }
    當 compiler 看到 rptr 為 restric,就會用 rptr += 8 取代 rptr += 3 和 rptr += 5
    而 ptr 就不應該被直接替換,因為它不是唯一會 access 該 data 的變數
     
    C99 用到restrict的例子:
    void* memcpy (void* restrict destination, const void* restrict source, size_t n);
    代表destination和source區段是不可重疊的
     
    FILE *fopen(const char *restrict pathname, const char *restrict type);
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(10,537)

    • 個人分類:電腦和網際網路
    ▲top
    • 5月 01 週六 201013:00
    • 夕陽的顏色

    昨天和爸媽去河堤運動,爸爸提到夕陽為什麼是紅色的
     
    google查詢。以下轉貼自 這裡  ( p.s. 照片真美 )
     

    為甚麼晴天時天空是藍色的?為甚麼夕陽是紅色的?


    這是太陽光被地球大氣散射 (scattering) 的結果。


    當陽光進入地球的大氣層後,空氣和水蒸氣的分子吸收部份陽光,

    再向四方八面輻射,這種現象稱為散射。

    以藍光波長最短,紅光波長最長,波長短的藍光較容易被散射。

    所以我們看到的天空才會是藍色。


    陽光是由不同顏色的光波所組成,看起來會是白色。
    當日落時夕陽接近地平線,陽光須穿過較厚的大氣層才到達地面 ,
    因此光在行進的過程中,會有大部份的藍光被散射,餘下紅光,所以夕陽會呈現紅色。
    另一方面,
    由於白天時太陽光只穿過較薄的大氣層,藍光被散射的程度減少,
    所以我們眼睛接收到太陽光的所有光波,看起來會是白色的,

    同時由於天空充滿了被散射的藍光,所以整個天空會呈現藍色。 



    ==================================================
    光的波長
    可視波長範圍380nm~780nm,此範圍內的光稱為可見光。
    紅光 750~630nm
    橙光 630~600nm 
    黃光 600~570nm
    綠光 570~490nm 
    藍光 490~460nm 
    靛光 460~430nm
    紫光 430~380nm 
    750nm以上稱為紅外線
    380nm以下稱為紫外線
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(935)

    • 個人分類:自然科學
    ▲top
    • 4月 26 週一 201008:59
    • 自動裁剪 掃描相片

    檔案 => 自動 => 裁切及拉直相片 => 再各自另存新檔
     
    可以自訂一連串連續動作:
    視窗 => 動作 / 步驟紀錄  (打開動作面板)
    建立新增組合(按鈕在面板上) => 取名"自訂動作" => 建立新增動作() => 就開始記錄你接下來的每個動作,直到按下停止按鈕(在動作面板上)。
    每次按下動作名稱 就會自動執行
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(234)

    • 個人分類:photoshop
    ▲top
    • 4月 10 週六 201021:08
    • 快樂數

    今天要改一個作業:寫程式判定快樂數
    學生們的解題想法寫得亂七八糟 => 臆測:大部份都亂抄亂寫
    奇怪,大家都這麼沒有求知慾嗎 XD
     
    快樂數 Happy number
    是一個正整數,在給定的進位制下,該數字所有 digits 的平方和而得到的新數,要再次求所有位數的平方和,如此重複進行,其最終結果為1的數。(這樣哪裡快樂阿 XD)
    否則,就是 Unhappy number。
     
    事實上,所有 Unhappy number 的位數平方和計算,最後都會進入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循環中。(進入循環的第一個數字不一定是 4)
    所以在任一輪出現上述其中任何一個數,就可以判定它不快樂了。要減少比對時間的話,只要比對上述隨便一個數就好了。
     
    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    測資介於 1~10^9  => 第一個數可能很大,第二個之後就都會小於729 ( 729 = 9^2 * 9 )
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(548)

    • 個人分類:
    ▲top
    • 4月 09 週五 201011:19
    • 函數呼叫

    函數呼叫 (Function Call)        參考1  參考2      
    以硬體的觀念來講,函數是放在記憶體中的一群指令,而每個函數被放置在不同的記憶體,如下圖所示:
     ┌──────────────────────────┐
     │  ┌───────────────────────┐  │
     │  │IP↘                                                                 code (text)   │  │
     │  │     ┌───┐      ┌────┐    ┌────┐      │  │
     │  │     │main(  )│      │函數 A( )│    │函數 B(  )│      │  │
     │  │     └───┘      └────┘    └────┘         │  │
     │  └───────────────────────┘  │
     │        ┌──────┐┌───┐┌────────┐    │
     │        │   data heap   ││ stack    ││ global name space  │    │
     │        └──────┘└───┘└────────┘    │
     └──────────────────────────┘
       code:放置程式碼的區塊,也叫做 text,意即程式的本文之意。
       data heap:所有的區域變數都被放在這裡。
       stack:此塊記憶體是給編譯程式和作業系統應用的,我們通常無法直接取用。
       global name space:放置所有的靜態變數、全域變數以及外部變數。(在 UNIX 系統下這塊記憶體也叫做 bss)
    一個程式佔據多大的記憶體,在 UNIX 系統下可以用 size 這個指令看出來,例如我們想看看 gcc 佔了多大的記憶體空間:
      [thccy14]/usr/local/bin> size gcc
      text    data    bss     dec     hex     filename
      57312   8192    0       65504   ffe0    gcc
     可以看到 gcc 的 code 有 57312 bytes,需要 8192 bytes 的 data heap,不需要 bss。
    程式的執行過程:
    首先,有一個叫做IP(Instruction Pointer,CPU 會依序執行IP所指位址的指令)的暫存器會指向程式開始的地方
    (通常是 main 函數),當函數呼叫發生時,硬體按照下列的流程執行程式的控制權轉移:
                               函數呼叫發生
                                    ↓
                     把目前的程式執行狀態存進 stack (含 IP) ,把函數的參數由右而左存進 stack
                                                ↓
                         把 IP 指向欲前往的函數
                                    ↓
                                前往函數
    進入函數之後,函數由 stack 取得參數 (這部份的碼由編譯器自動產生)之後,開始執行,執行完畢時依以下的流程交回控制權:
                                  函數結束
                                     ↓
                            將傳回值存入 stack
                                     ↓
                       取出 stack 中原程式執行狀態,恢復原程式執行狀態
                                              ↓
                            取出傳回值,儲存目前的IP
                                              ↓
                          繼續執行原來的程式
    每呼叫一次函數, CPU 就必須浪費很多時間來處理這些記憶體的儲存和更新,會使執行的速度變慢,
    所以說遞迴函數不斷地執行函數的呼叫,因此會使執行速度較慢。
    一個 activation record (stack frame) 儲存程式的:
    –參數與本地變數
    –執行結果(回傳值)
    –返回位址(return address)
    –其他環境資訊(詳見第6單元)
    當一個程式被呼叫執行時,系統會自動配置一個activation record (stack frame)給它儲存以上資訊,
    並且push這些資訊到stack;副程式執行結束時,便從其activation record中取得返回位址,回到上一層
    (當初呼叫它的)程式繼續執行下一句,而系統也在此時收回它的 A.V。
    同一支執行中程式的所有副程式的 A.V,都是放在同一個 stack 上,先進後出。
    有些書把這個 stack 叫做 system stack (系統堆疊)。
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(3,051)

    • 個人分類:電腦和網際網路
    ▲top
    • 3月 29 週一 201018:20
    • C vs C++

     
    C vs C++
    STL
    OOP
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(45)

    • 個人分類:電腦和網際網路
    ▲top
    • 3月 20 週六 201000:17
    • Pointer to function

    前天跟張貿翔老師的計概課
     
    Pointer to void   可存任意型態的指標
    使用: void* p; //
        double i;
        p = &i;
    Pointer to function    指標指向一段程式的起始位置
    使用:
     double (*f) (float); // 指標 f 指向某個function,其傳入參數型態為 float,回傳型態為 double
     f = X; // f 指向function X,X意即代表X這個函式的起始位置
     result = (*f)( v1 ); // result 型態要double,v1 要float
     
    C語言編譯器的程式庫參考手冊, 有一組與 ANSI C 相容的函數 qsort, bsearch
    規格說明:
     void qsort(void *base, sizt_t nelem, size_t width, 
         int (*fcmp)(const void *, const void *));
     void bsearch(const void *key, const void *base, size_t nelem, size_t width,
        int (*fcmp)(const void *, const void *));
     以上 #include <stdlib.h> 則可使用 
    qsort (待排序 data 的起始位置, data的個數, data的大小,單位byte, 一個做比較大小的函式)
    其中
     int (*fcmp)(const void *, const void *))  代表會呼叫一個使用者自製的函式
     如果今天要使用 qsort 排序 int,則我們製作的是一個可以比較兩個int參數大小的 function
     像這樣: int ComInt( const int *x, const int *y ){ statement }
    然而
     如果今天要使用 qsort 排序 string,那我們要製作的就是根據我們自己定義(怎樣是大? 怎樣是小?)比較大小的 function
    所以這就是 function pointer 的一個優點:
    在製作一個可以比較廣泛使用(如上可以排序各種型態)的函式時,幫助使其簡化(只針對參數稍微調整程式)。
     
    另外,在 int (*fcmp)(const void *, const void *)) 中傳入的參數是指標型態,而不是只傳 value,(只是做比較又沒有要改值,可以傳 value 就好阿?)
    這是由於在比較大小時,當我們比較的不是 float, char 等基本數型,而是字串(即字元陣列)時,qsort 才能夠正確的運作。
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(736)

    • 個人分類:電腦和網際網路
    ▲top
    • 3月 07 週日 201010:24
    • 陣列的參數傳遞

    reference
    C語言只能傳遞指標,無法傳遞陣列的內容。
    假設要傳遞一個二維陣列,則C會幫我們將該陣列的起始位置傳入。
    參數宣告部分  有如下不同的方式:
    錯誤示範
     void foo1(int x[][]) {  // 編譯過,但Compiler不知如何翻譯
          x[2][2] = 0;  // 編譯錯誤,Compiler不知如何翻譯
     }
     void foo4(int x[3][]) {  // 編譯錯誤。
     }
     
    無論是幾維的陣列,C語言都是分配一塊連續的記憶體空間來處理。
    於是其是以row major的方式來處理多維到一維的對應。
    因此副程式的陣列參數宣告應該給予column大小(二維)
    正確示範
     void foo2(int x[][3]) {  // Compiler知道如何翻譯
          x[1][1] = 0;  // Compiler知道要翻成*(x+1*3+1)
     }
     void foo3(int x[2][3]) {  // Compiler知道如何翻譯
          x[1][1] = 0;  // Compiler知道要翻成*(x+1*3+1)
     }
     void foo5(int *x) {  // 能傳入pointer,也能傳一個陣列起始位置*M(int M[o][x]),
               但是副程式內部的位址要自己計算,因為Compiler不知道你的column大小
          *(x+1*3+1) = 0;  //位址要自己計算   *(M+1*x+o)
     }
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(1,534)

    • 個人分類:電腦和網際網路
    ▲top
    • 2月 24 週三 201015:32
    • photoshop 工作環境

    還原編輯
     只還原一個步驟  Ctrl+Z
     還原多個步驟:打開步驟筆記浮動式窗(視窗 => 步驟紀錄)
     
    (繼續閱讀...)
    文章標籤

    Y CP 發表在 痞客邦 留言(0) 人氣(4)

    • 個人分類:photoshop
    ▲top
    12...9»

    自訂側欄

    自訂側欄

    個人資訊

    Y CP
    暱稱:
    Y CP
    分類:
    不設分類
    好友:
    累積中
    地區:

    熱門文章

    • (10,537)C關鍵字 volatile, restrict
    • (3,051)函數呼叫
    • (376)連續讀檔
    • (40)令人高興的心理測驗

    文章分類

    • 娛樂 (2)
    • 植物 (3)
    • photoshop (4)
    • 自然科學 (1)
    • 電腦和網際網路 (12)
    • 未分類文章 (1)

    最新文章

    • 圖片格式 gif, jpg, png
    • C關鍵字 volatile, restrict
    • 夕陽的顏色
    • 自動裁剪 掃描相片
    • 快樂數
    • 函數呼叫
    • C vs C++
    • Pointer to function
    • 陣列的參數傳遞
    • photoshop 工作環境

    動態訂閱

    文章精選

    文章搜尋

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣: