Quick Search:
CODE
Oracle PL/SQL Code Library
JOBS
Find Or Post Oracle Jobs
FORUM
Oracle Discussion & Chat
 PHP Code: Show current time as PNG-image Jump to:  
Category: >> PHP Code >> Show current time as PNG-image Bookmark and Share

<< lastnext >>

Snippet Name: Show current time as PNG-image

Description: Code to display the current time as a .PNG image.

Comment: (none)

Language: PHP
Highlight Mode: PHP
Last Modified: March 01st, 2009

<?PHP 
    // 
    // clock.php3 -- shows the current time as a PNG-image 
    FUNCTION set_4pixel($r, $g, $b, $x, $y) 
    { 
    GLOBAL $sx, $sy, $pixels; 
 
    $ofs = 3 * ($sx * $y + $x); 
    $pixels[$ofs] = CHR($r); 
    $pixels[$ofs + 1] = CHR($g); 
    $pixels[$ofs + 2] = CHR($b); 
    $pixels[$ofs + 3] = CHR($r); 
    $pixels[$ofs + 4] = CHR($g); 
    $pixels[$ofs + 5] = CHR($b); 
    $ofs += 3 * $sx; 
    $pixels[$ofs] = CHR($r); 
    $pixels[$ofs + 1] = CHR($g); 
    $pixels[$ofs + 2] = CHR($b); 
    $pixels[$ofs + 3] = CHR($r); 
    $pixels[$ofs + 4] = CHR($g); 
    $pixels[$ofs + 5] = CHR($b); 
    } 
 
    FUNCTION draw2digits($x, $y, $number) 
    { 
    draw_digit($x, $y, (int) ($number / 10)); 
    draw_digit($x + 11, $y, $number % 10); 
    } 
 
    FUNCTION draw_digit($x, $y, $digit) 
    { 
    GLOBAL $sx, $sy, $pixels, $digits, $lines; 
 
    $digit = $digits[$digit]; 
    $m = 8; 
    FOR ($b = 1, $i = 0; $i < 7; $i++, $b *= 2) { 
        IF (($b & $digit) == $b) { 
        $j = $i * 4; 
        $x0 = $lines[$j] * $m + $x; 
        $y0 = $lines[$j + 1] * $m + $y; 
        $x1 = $lines[$j + 2] * $m + $x; 
        $y1 = $lines[$j + 3] * $m + $y; 
        IF ($x0 == $x1) { 
            $ofs = 3 * ($sx * $y0 + $x0); 
            FOR ($h = $y0; $h <= $y1; $h++, $ofs += 3 * $sx) { 
            $pixels[$ofs] = CHR(0); 
            $pixels[$ofs + 1] = CHR(0); 
            $pixels[$ofs + 2] = CHR(0); 
            } 
        } ELSE { 
            $ofs = 3 * ($sx * $y0 + $x0); 
            FOR ($w = $x0; $w <= $x1; $w++) { 
            $pixels[$ofs++] = CHR(0); 
            $pixels[$ofs++] = CHR(0); 
            $pixels[$ofs++] = CHR(0); 
            } 
        } 
        } 
    } 
    } 
 
    // create a chunk with the bytes in $data and the specified 
    // type and add it to $result 
    FUNCTION add_chunk($type) 
    { 
    GLOBAL $result, $data, $chunk, $crc_table; 
 
    // chunk layout: 
    // length: 4 bytes: counting chunk data only 
    // chunk type: 4 bytes 
    // chunk data: length bytes 
    // CRC: 4 bytes: CRC-32 checksum of the type and the data 
 
    // copy data and create CRC checksum 
    $len = STRLEN($data); 
    $chunk = PACK("c*", ($len >> 24) & 255, 
        ($len >> 16) & 255, 
        ($len >> 8) & 255, 
        $len & 255); 
    $chunk .= $type; 
    $chunk .= $data; 
 
    // calculate a CRC checksum with the bytes chunk[4..len-1] 
    $z = 16777215; 
    $z |= 255 << 24; 
    $c = $z; 
    FOR ($n = 4; $n < STRLEN($chunk); $n++) { 
        $c8 = ($c >> 8) & 0xffffff; 
        $c = $crc_table[($c ^ ORD($chunk[$n])) & 0xff] ^ $c8; 
    } 
    $crc = $c ^ $z; 
 
    $chunk .= CHR(($crc >> 24) & 255); 
    $chunk .= CHR(($crc >> 16) & 255); 
    $chunk .= CHR(($crc >> 8) & 255); 
    $chunk .= CHR($crc & 255); 
 
    // add it to the result 
    $result .= $chunk; 
    } 
 
 
    // ============ 
    // main program 
    // ============ 
 
    $sx = 80; 
    $sy = 21; 
    $pixels = ""; 
 
    // create filling 
    FOR ($h = 0; $h < $sy; $h++) { 
    FOR ($w = 0; $w < $sx; $w++) { 
        $r = 100 / $sx * $w + 155; 
        $g = 100 / $sy * $h + 155; 
        $b = 255 - (100 / ($sx + $sy) * ($w + $h)); 
        $pixels .= CHR($r); 
        $pixels .= CHR($g); 
        $pixels .= CHR($b); 
    } 
    } 
 
    $date = GETDATE(); 
    $s = $date["seconds"]; 
    $m = $date["minutes"]; 
    $h = $date["hours"]; 
    $digits = ARRAY(95, 5, 118, 117, 45, 121, 123, 69, 127, 125); 
    $lines = ARRAY(1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 1, 1, 0, 0, 0, 1, 0, 2, 1, 2, 0, 1, 1, 1, 0, 0, 1, 0); 
 
    draw2digits(4, 2, $h); 
    draw2digits(30, 2, $m); 
    draw2digits(56, 2, $s); 
    set_4pixel(0, 0, 0, 26, 7); 
    set_4pixel(0, 0, 0, 26, 13); 
    set_4pixel(0, 0, 0, 52, 7); 
    set_4pixel(0, 0, 0, 52, 13); 
 
    // create crc-table 
    $z = -306674912;  // = 0xedb88320 
    FOR ($n = 0; $n < 256; $n++) { 
        $c = $n; 
        FOR ($k = 0; $k < 8; $k++) { 
            $c2 = ($c >> 1) & 0x7fffffff; 
            IF ($c & 1) $c = $z ^ ($c2); ELSE $c = $c2; 
        } 
        $crc_table[$n] = $c; 
    } 
 
    // PNG file signature 
    $result = PACK("c*", 137,80,78,71,13,10,26,10); 
 
    // IHDR chunk data: 
    //   width:              4 bytes 
    //   height:             4 bytes 
    //   bit depth:          1 byte (8 bits per RGB value) 
    //   color type:         1 byte (2 = RGB) 
    //   compression method: 1 byte (0 = deflate/inflate) 
    //   filter method:      1 byte (0 = adaptive filtering) 
    //   interlace method:   1 byte (0 = no interlace) 
    $data = PACK("c*", ($sx >> 24) & 255, 
    ($sx >> 16) & 255, 
    ($sx >> 8) & 255, 
    $sx & 255, 
    ($sy >> 24) & 255, 
    ($sy >> 16) & 255, 
    ($sy >> 8) & 255, 
    $sy & 255, 
    8, 
    2, 
    0, 
    0, 
    0); 
    add_chunk("IHDR"); 
 
    // IDAT: image data: 
    //    scanline: 
    //        filter byte: 0 = none 
    //        RGB bytes for the line 
    //    the scanline is compressed with "zlib", method 8 (RFC-1950): 
    //        compression method/flags code: 1 byte ($78 = method 8, 32k window) 
    //        additional flags/check bits:   1 byte ($01: FCHECK = 1, FDICT = 0, FLEVEL = 0) 
    //        compressed data blocks:        n bytes 
    //            one block (RFC-1951): 
    //                bit 0: BFINAL: 1 for the last block 
    //                bit 1 and 2: BTYPE: 0 for no compression 
    //                next 2 bytes: LEN (LSB first) 
    //                next 2 bytes: one's complement of LEN 
    //                LEN bytes uncompressed data 
    //        check value:  4 bytes (Adler-32 checksum of the uncompressed data) 
    // 
    $len = ($sx * 3 + 1) * $sy; 
    $data = PACK("c*", 0x78, 0x01, 
        1, 
    $len & 255, 
    ($len >> 8) & 255, 
    255 - ($len & 255), 
    255 - (($len >> 8) & 255)); 
    $start = STRLEN($data); 
    $i2 = 0; 
    FOR ($h = 0; $h < $sy; $h++) { 
    $data .= CHR(0); 
    FOR ($w = 0; $w < $sx * 3; $w++) { 
        $data .= $pixels[$i2++]; 
    } 
    } 
 
 
    // calculate a Adler32 checksum with the bytes data[start..len-1] 
    $s1 = 1; 
    $s2 = 0; 
    FOR ($n = $start; $n < STRLEN($data); $n++) { 
    $s1 = ($s1 + ORD($data[$n])) % 65521; 
    $s2 = ($s2 + $s1) % 65521; 
    } 
    $adler = ($s2 << 16) | $s1; 
 
    $data .= CHR(($adler >> 24) & 255); 
    $data .= CHR(($adler >> 16) & 255); 
    $data .= CHR(($adler >> 8) & 255); 
    $data .= CHR($adler & 255); 
    add_chunk("IDAT"); 
 
    // IEND: marks the end of the PNG-file 
    $data = ""; 
    add_chunk("IEND"); 
 
    // print the image 
    HEADER("Content-type: image/png"); 
    PRINT($result); 
?>
 


Free
Oracle Magazine
Subscriptions
and Oracle White Papers


SQL University.net courses meet the most demanding needs of the business world for advanced education in a cost-effective manner. SQL University.net courses are available immediately for IT professionals and can be taken without disruption of your workplace schedule or processes.

Compared to traditional travel-based training, SQL University.net saves time and valuable corporate resources, allowing companies to do more with less. That's our mission, and that's what we deliver.

Click here to find out more
 
Home      :      Code Library      :      Sponsors      :      Privacy      :      Terms of Use      :      Contact Us 81 users online    © 2009 psoug.org

PSOUG LOGIN
Username: 
Password: 
Forgot your password?