精华内容
下载资源
问答
  • 主要介绍了PHP使用GIFEncoder类生成gif动态滚动字幕,文字滚动分为两种情况,一种为水平滚动,一种为垂直滚动,需要的朋友可以参考下
  • PHP使用GIFEncoder生成动态gif滚动字幕

    千次阅读 2008-08-26 21:19:00
    但是,不许生成gif图片。所以上网找了GIFEncoder这个类库。确实很好用,但是,应用过程中也出现了一些问题,现在写在这里,以供后来人参考,少走弯路。ClassGIFEncoder{var$GIF="GIF89a";/*GIFheader6bytes*/v

    今天在公司,经理让做一个滚动字幕。但是,必须生成gif图片。所以上网找了GIFEncoder这个类库。确实很好用,但是,应用过程中也出现了一些问题,现在写在这里,以供后来人参考,少走弯路。

    1. <?php
    2. Class GIFEncoder {
    3.     var $GIF = "GIF89a";                /* GIF header 6 bytes        */
    4.     var $VER = "GIFEncoder V2.06";        /* Encoder version                */
    5.  
    6.     var $BUF = Array ( );
    7.     var $LOP =  0;
    8.     var $DIS =  2;
    9.     var $COL = -1;
    10.     var $IMG = -1;
    11.  
    12.     var $ERR = Array (
    13.     'ERR00' =>"Does not supported function for only one image!",
    14.     'ERR01' =>"Source is not a GIF image!",
    15.     'ERR02' =>"Unintelligible flag ",
    16.     'ERR03' =>"Could not make animation from animated GIF source",
    17.     );
    18.  
    19.     /*
    20.     :::::::::::::::::::::::::::::::::::::::::::::::::::
    21.     ::
    22.     ::        GIFEncoder...
    23.     ::
    24.     */
    25.     function GIFEncoder        (
    26.     $GIF_src, $GIF_dly, $GIF_lop, $GIF_dis,
    27.     $GIF_red, $GIF_grn, $GIF_blu, $GIF_mod
    28.     ) {
    29.         if ( ! is_array ( $GIF_src ) && ! is_array ( $GIF_tim ) ) {
    30.             printf        ( "%s: %s", $this->VER, $this->ERR [ 'ERR00' ] );
    31.             exit        ( 0 );
    32.         }
    33.         $this->LOP = ( $GIF_lop > -1 ) ? $GIF_lop : 0;
    34.         $this->DIS = ( $GIF_dis > -1 ) ? ( ( $GIF_dis < 3 ) ? $GIF_dis : 3 ) : 2;
    35.         $this->COL = ( $GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1 ) ?
    36.         ( $GIF_red | ( $GIF_grn << 8 ) | ( $GIF_blu << 16 ) ) : -1;
    37.  
    38.         for ( $i = 0; $i < count ( $GIF_src ); $i++ ) {
    39.             if ( strToLower ( $GIF_mod ) == "url" ) {
    40.                 $this->BUF [ ] = fread ( fopen ( $GIF_src [ $i ], "rb" ), filesize ( $GIF_src [ $i ] ) );
    41.             }
    42.             else if ( strToLower ( $GIF_mod ) == "bin" ) {
    43.                 $this->BUF [ ] = $GIF_src [ $i ];
    44.             }
    45.             else {
    46.                 printf        ( "%s: %s ( %s )!", $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod );
    47.                 exit        ( 0 );
    48.             }
    49.             if ( substr ( $this->BUF [ $i ], 0, 6 ) != "GIF87a" && substr ( $this->BUF [ $i ], 0, 6 ) != "GIF89a" ) {
    50.                 printf        ( "%s: %d %s", $this->VER, $i, $this->ERR [ 'ERR01' ] );
    51.                 exit        ( 0 );
    52.             }
    53.             for ( $j = ( 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) ), $k = TRUE; $k; $j++ ) {
    54.                 switch ( $this->BUF [ $i ] { $j } ) {
    55.                     case "!":
    56.                         if ( ( substr ( $this->BUF [ $i ], ( $j + 3 ), 8 ) ) == "NETSCAPE" ) {
    57.                             printf        ( "%s: %s ( %s source )!", $this->VER, $this->ERR [ 'ERR03' ], ( $i + 1 ) );
    58.                             exit        ( 0 );
    59.                         }
    60.                         break;
    61.                     case ";":
    62.                         $k = FALSE;
    63.                         break;
    64.                 }
    65.             }
    66.         }
    67.         GIFEncoder::GIFAddHeader ( );
    68.         for ( $i = 0; $i < count ( $this->BUF ); $i++ ) {
    69.             GIFEncoder::GIFAddFrames ( $i, $GIF_dly [ $i ] );
    70.         }
    71.         GIFEncoder::GIFAddFooter ( );
    72.     }
    73.     /*
    74.     :::::::::::::::::::::::::::::::::::::::::::::::::::
    75.     ::
    76.     ::        GIFAddHeader...
    77.     ::
    78.     */
    79.     function GIFAddHeader ( ) {
    80.         $cmap = 0;
    81.  
    82.         if ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x80 ) {
    83.             $cmap = 3 * ( 2 << ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 ) );
    84.  
    85.             $this->GIF .= substr ( $this->BUF [ 0 ], 6, 7                );
    86.             $this->GIF .= substr ( $this->BUF [ 0 ], 13, $cmap        );
    87.             $this->GIF .= "!/377/13NETSCAPE2.0/3/1" . GIFEncoder::GIFWord ( $this->LOP ) . "/0";
    88.         }
    89.     }
    90.     /*
    91.     :::::::::::::::::::::::::::::::::::::::::::::::::::
    92.     ::
    93.     ::        GIFAddFrames...
    94.     ::
    95.     */
    96.     function GIFAddFrames ( $i, $d ) {
    97.  
    98.         $Locals_str = 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) );
    99.  
    100.         $Locals_end = strlen ( $this->BUF [ $i ] ) - $Locals_str - 1;
    101.         $Locals_tmp = substr ( $this->BUF [ $i ], $Locals_str, $Locals_end );
    102.  
    103.         $Global_len = 2 << ( ord ( $this->BUF [ 0  ] { 10 } ) & 0x07 );
    104.         $Locals_len = 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );
    105.  
    106.         $Global_rgb = substr ( $this->BUF [ 0  ], 13,
    107.         3 * ( 2 << ( ord ( $this->BUF [ 0  ] { 10 } ) & 0x07 ) ) );
    108.         $Locals_rgb = substr ( $this->BUF [ $i ], 13,
    109.         3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) );
    110.  
    111.         $Locals_ext = "!/xF9/x04" . chr ( ( $this->DIS << 2 ) + 0 ) .
    112.         chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . "/x0/x0";
    113.  
    114.         if ( $this->COL > -1 && ord ( $this->BUF [ $i ] { 10 } ) & 0x80 ) {
    115.             for ( $j = 0; $j < ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ); $j++ ) {
    116.                 if        (
    117.                 ord ( $Locals_rgb { 3 * $j + 0 } ) == ( $this->COL >>  0 ) & 0xFF &
    118.                 ord ( $Locals_rgb { 3 * $j + 1 } ) == ( $this->COL >>  8 ) & 0xFF &
    119.                 ord ( $Locals_rgb { 3 * $j + 2 } ) == ( $this->COL >> 16 ) & 0xFF
    120.                 ) {
    121.                     $Locals_ext = "!/xF9/x04" . chr ( ( $this->DIS << 2 ) + 1 ) .
    122.                     chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . chr ( $j ) . "/x0";
    123.                     break;
    124.                 }
    125.             }
    126.         }
    127.         switch ( $Locals_tmp { 0 } ) {
    128.             case "!":
    129.                 $Locals_img = substr ( $Locals_tmp, 8, 10 );
    130.                 $Locals_tmp = substr ( $Locals_tmp, 18, strlen ( $Locals_tmp ) - 18 );
    131.                 break;
    132.             case ",":
    133.                 $Locals_img = substr ( $Locals_tmp, 0, 10 );
    134.                 $Locals_tmp = substr ( $Locals_tmp, 10, strlen ( $Locals_tmp ) - 10 );
    135.                 break;
    136.         }
    137.         if ( ord ( $this->BUF [ $i ] { 10 } ) & 0x80 && $this->IMG > -1 ) {
    138.             if ( $Global_len == $Locals_len ) {
    139.                 if ( GIFEncoder::GIFBlockCompare ( $Global_rgb, $Locals_rgb, $Global_len ) ) {
    140.                     $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
    141.                 }
    142.                 else {
    143.                     $byte  = ord ( $Locals_img { 9 } );
    144.                     $byte |= 0x80;
    145.                     $byte &= 0xF8;
    146.                     $byte |= ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 );
    147.                     $Locals_img { 9 } = chr ( $byte );
    148.                     $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
    149.                 }
    150.             }
    151.             else {
    152.                 $byte  = ord ( $Locals_img { 9 } );
    153.                 $byte |= 0x80;
    154.                 $byte &= 0xF8;
    155.                 $byte |= ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );
    156.                 $Locals_img { 9 } = chr ( $byte );
    157.                 $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
    158.             }
    159.         }
    160.         else {
    161.             $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
    162.         }
    163.         $this->IMG  = 1;
    164.     }
    165.     /*
    166.     :::::::::::::::::::::::::::::::::::::::::::::::::::
    167.     ::
    168.     ::        GIFAddFooter...
    169.     ::
    170.     */
    171.     function GIFAddFooter ( ) {
    172.         $this->GIF .= ";";
    173.     }
    174.     /*
    175.     :::::::::::::::::::::::::::::::::::::::::::::::::::
    176.     ::
    177.     ::        GIFBlockCompare...
    178.     ::
    179.     */
    180.     function GIFBlockCompare ( $GlobalBlock, $LocalBlock, $Len ) {
    181.  
    182.         for ( $i = 0; $i < $Len; $i++ ) {
    183.             if        (
    184.             $GlobalBlock { 3 * $i + 0 } != $LocalBlock { 3 * $i + 0 } ||
    185.             $GlobalBlock { 3 * $i + 1 } != $LocalBlock { 3 * $i + 1 } ||
    186.             $GlobalBlock { 3 * $i + 2 } != $LocalBlock { 3 * $i + 2 }
    187.             ) {
    188.                 return ( 0 );
    189.             }
    190.         }
    191.  
    192.         return ( 1 );
    193.     }
    194.     /*
    195.     :::::::::::::::::::::::::::::::::::::::::::::::::::
    196.     ::
    197.     ::        GIFWord...
    198.     ::
    199.     */
    200.     function GIFWord ( $int ) {
    201.  
    202.         return ( chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );
    203.     }
    204.     /*
    205.     :::::::::::::::::::::::::::::::::::::::::::::::::::
    206.     ::
    207.     ::        GetAnimation...
    208.     ::
    209.     */
    210.     function GetAnimation ( ) {
    211.         return ( $this->GIF );
    212.     }
    213. }
    214. ?>

     

    文字滚动分为两种情况。第一种为水平滚动

    1. <?php
    2. require_once("GIFEncoder.class.php");
    3. $count=0;   //设置默认计数器
    4. while(true){
    5.     $str = $_REQUEST['str'] ? $_REQUEST['str']:"暂无输入";
    6.     $length=strlen($str)*9;     //计算行长度,这个计算的比较简单,就是每个字数*9个像素
    7.     $im=imagecreatefromgif("hudongbg.gif");     //根据图片创建图像
    8.     $white = ImageColorAllocate($im,255,255,255);       //设置一个白色
    9.     $str = iconv("GB2312","UTF-8",$str);        //特别注意的是转换编码,因为之后用到的imagettftext只能用utf-8编码
    10.     $now=220-$count*5;      //当前运行的水平位置
    11.     imagettftext($im,13,0,$now,20,$white,"ziti.ttf",$str);      //根据字体在图片上写文字,参数意思(图像源,文字大小,倾斜角度,水平位置,垂直位置,颜色,使用的字体文件,要写的内容
    12.     imagegif($im);      
    13.     imagedestroy($im);
    14.     $imagedata[] = ob_get_contents();       //创建这一帧的图像数据
    15.     ob_clean();
    16.     $count++;
    17.     if ($now+$length<0){    //如果最后一个文字移动到头,那么结束
    18.         break;
    19.     }
    20. }
    21. $diy[]=0;//开始延迟时间
    22. $gif = new GIFEncoder($imagedata,$diy,0,2,0,0,0,"bin");
    23.  
    24. ob_start();
    25. Header ('Content-type:image/gif');
    26.  
    27. echo $gif->GetAnimation();
    28. ?>

    然后是垂直的

    1. <?php
    2. /*
    3.  
    4. 从url获得"str=第一行;第二行;第三行"的数据
    5.  
    6. */
    7. require_once("GIFEncoder.class.php");
    8. $array_str=array();
    9. $str=$_GET['str'];
    10. /*
    11.  
    12. 将$str转化成数组
    13.  
    14. */
    15. if ($str!=''){
    16.     $array_str=explode(";",$str);
    17. }else{
    18.     $array_str=array("欢迎您光临本店!");
    19. }
    20. /*
    21.  
    22. 如果数组元素没有值,清除最后一个“;”
    23.  
    24. */
    25. foreach( $array_str as $k=>$v){
    26.     if( !$v )
    27.     unset( $array_str[$k] );
    28. }
    29.  
    30.  
    31. for ($i=0,$length=count($array_str);$i<$length;$i++){
    32.     for ($k=0;$k<20;$k++){
    33.         $im=imagecreatefromgif("hudongbg.gif");     //根据图片创建图像
    34.         $white = ImageColorAllocate($im,255,255,255);       //设置一个白色
    35.         $test = iconv("GB2312","UTF-8",$array_str[$i]);     //特别注意的是转换编码,因为之后用到的imagettftext只能用utf-8编码,注意,一定要用字符串接收,不能用数组,否则会乱码
    36.         $heigth=40-$k;        //当前文字高度
    37.         imagettftext($im,13,0,0,$heigth,$white,"ziti.ttf",$test);        //将文字写入图片
    38.         imagegif($im);
    39.         $imagedata[] = ob_get_contents();
    40.         ob_clean();
    41.     }
    42. }
    43. /*
    44. 这里是设置每一张图片的延迟时间,到第20帧的时候,延迟2秒。这样才能出现文字走到顶,停顿一会的效果
    45. */
    46.  
    47. $delay=array();
    48. for ($i=1,$length=count($array_str)*20;$i<=$length;$i++){
    49.     if ($i%20==0){
    50.         $delay[$i-1]="200";
    51.     }else{
    52.         $delay[$i-1]="1";
    53.     }
    54. }
    55. $transparent=array(0);
    56. $gif = new GIFEncoder($imagedata,$delay,0,2,0,0,$transparent,"bin");
    57. ob_start();
    58. Header ('Content-type:image/gif');
    59. echo $gif->GetAnimation();
    60. ?>
    展开全文
  • 这几天在做的健身房后台的时候有一个将二维码,还有名称 放置背景图上,并且要居中显示,最后生成健身房图片de功能,查找了各种资料,最后完成了属于享健身平台的每一个健身房的一个带有二维码的图片,并且将图片...
    这几天在做的健身房后台的时候有一个将二维码,还有名称 放置背景图上,并且要居中显示,最后生成健身房图片de功能,查找了各种资料,最后完成了属于享健身平台的每一个健身房的一个带有二维码的图片,并且将图片链接存入数据库中。
    大概思路是这样的:获取二维码图片,获取背景图片,将二维码图片放置在背景图片上,然后调整X轴,Y轴的位置,最终放置在背景图上合适的位置,保存图片,然后获取图片,将健身房的名称放置在背景图的合适位置,并且水平居中。
    名称居中这块要注意要获取字符盒子的左边X点和右边X点,这样才能算出居中的位置,还要注意有汉字和英文的区分,虽说一个汉字3个字符,但是有英文和汉字组合的名称的时候会有偏差,我的做法是用正则匹配有英文的,找到偏差值,将字符的长度减去偏差值,这样就会居中了,代码如下:    
       
            //获取二维码图片
            $type['qr_code']=  ROOT_PATH . 'public'.$user['qr_logocode'];
            //准备好的背景图片
            $background = ROOT_PATH.'public/static/gym/images/timg1.png';
    
            if ($background !== FALSE) {
    
                $QR = imagecreatefromstring(file_get_contents($type['qr_code']));
    
                $background = imagecreatefromstring(file_get_contents($background));
    
                $QR_width = imagesx($QR);//源图宽度 源图就是需要载入的图片
    
                $QR_height = imagesy($QR);//源图高度
    
                $logo_width = imagesx($background);//目标图宽度  目标图就是背景图
    
                $logo_height = imagesy($background);//目标图高度
    
                $logo_qr_width = $logo_width / 1.6;//缩放目标图的width
    
                $from_width = ($logo_width - $logo_qr_width) / 2;//目标 X 坐标点
                $from_height = $QR_height*3.6 ;//目标 Y 坐标点
    
                //重新组合图片并调整大小 目标图     源图   目标 X 坐标点  目标 Y 坐标点
                imagecopyresampled($background, $QR, $from_width, $from_height,
                    //源的X坐标点 源的Y坐标点  目标宽度   目标高度         源图象的宽度  源图象的高度
                    0, 0, $logo_qr_width, $logo_qr_width, $QR_width, $QR_height);
                $backImg = explode('/',$user['qr_logocode']);
    
                foreach ($backImg as &$_v){
                    if(strpos($_v,'jpg')){
                        $_v = 'back_'.$_v;
                    }
                }
                $backImgname = implode('/',$backImg);//给新图片命名
                //输出图片保存在文件夹中,执行成功你会发现你的文件夹中多了一个图片
                imagejpeg($background, ROOT_PATH . 'public'.$backImgname);
    
                //给图片添加健身房名称
                $text = $user['name'];//文字
                $strlen = strlen($text);
                if(preg_match( '/[A-Za-z]*/',$text)){
                    $strlen = $strlen-20;
                }
    
                $font = ROOT_PATH . 'public/static/gym/fonts/PingFang Bold.ttf';//字体
                $text_x = imagettfbbox (110, $strlen , $font , $text);
                $widths=$text_x[2]-$text_x[0];//右下角X位置减去左下角X位置得到字符的宽度
                $widths=($logo_width-$widths)*0.5;//获取居中的X轴
    
                $image = \think\Image::open('.'.$backImgname);
                $image -> text($text,$font,110,'#ffffff',[$widths,1050])
                       ->save('.'.$backImgname);
                
            }
    展开全文
  • 手机端网站,要求点击分享封面,可以将缩略图、标题、简介按照一定排版生成图片,并包含当前url的二维码

    手机端网站,要求点击分享封面,可以将缩略图、标题、简介按照一定排版生成图片,并包含当前url的二维码

    本机纯html页面,生成图片完全OK,但是放到thinkphp框架后,死活就是不能生成,后来检测到是渲染富文本的变量导致,究其原因目前还不知道为什么。解决方法,在生成图片的时候,将富文本的div进行隐藏,生成后再显示。
    滚动条的位置要重置,否则生成的图片上部分会有留白
    代码如下
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>{$article.post_title}</title>
        <link href="__TMPL__/public/assets/mftw/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body>
    
    <!--排版默认隐藏-->
    <div class="" id="poster-container" style="display: none;">
        <div class="poster-container " style="background:#0b6cbc;padding-top: 20px;">
            <div style="text-align: center;padding: 10px 0;">
                <img src="__TMPL__/public/assets/image/logo.jpg" class="img-responsive" width="300" style="display: inline-block;" />
            </div>
            <h3 style="text-align: center;color: #fff;margin-bottom: 25px;">测试文字内容</h3>
            <div style="background: #fff;padding: 20px;border-top-left-radius: 5px;border-top-right-radius:5px;">
                <div><button type="button" class="btn btn-danger btn-sm">关注</button><span style="color: #999;margin-left: 15px;">{:date('Y-m-d H:i',$vo['published_time'])}</span></div>
                <!--<div style="padding-top:20px;"><img src="{:cmf_get_image_url($article.more.thumbnail)}" style="width: 100%;"></div>-->
                <h4 style="margin-top: 20px;text-align:left;">{$article.post_title}</h4>
                <div style="padding-top: 20px;">
                    <p>{$article.post_excerpt}</p>
                </div>
                <hr>
                <div class="row">
                    <div class="col-sm-4 col-xs-4">
                        <img src="__TMPL__/public/assets/image/postlogo.jpg" class="img-responsive">
                    </div>
                    <div class="col-sm-4 col-xs-4">
                        <p>
                            长按识别二维码<br>
                            获取更多内容
                        </p>
                    </div>
                    <div class="col-sm-4 col-xs-4">
    
                        <div class="poster-qrcode" >
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    <!--生成图片后显示-->
    <div class="toimg" style="
    position:fixed;left:0px;top:0;
        background:#0b6cbc;
        width:100%; 
        height:100%;
        display:none;
        z-Index:999;
    ">
        <div class="container" style="text-align:center;padding-top:0px;">
            <!--<div class="pull-right close-img" style="padding-right:20px;margin-bottom:20px;"><i class="glyphicon glyphicon-remove"></i></div>-->
            <img id="posterImg" class="img-responsive" style="width:100%;display:inline-block;" />
        </div>
    </div>
    
    
    <script src="https://libs.baidu.com/jquery/1.7.0/jquery.min.js"></script>
    <script src="http://www.jq22.com/js/jquery.qrcode.min.js"></script>
    <script src="http://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
    
    <script type="text/javascript">
        $(document).ready(function() {
            //生成二维码
            $('.poster-qrcode').qrcode({
                mode: 4,
                mSize: 20,
                //label: '文字Logo',//使用文字logo必须去掉mode,mSize参数
                image: $(".poster-qrcode-logo")[0],
                text: window.location.href,
                size: 1080/3,
                render: 'canvas',
                width : 80,
                height : 80
            });
        });
        // 生成海报
    
        function createPoster() {
            $(".article").hide();
            $(".toimg").show();
            $("#poster-container").show();
    
            var dom = $('.poster-container');
            var width = $('.toimg').width(); //获取dom 宽度
            var height = $('.toimg').height(); //获取dom 高度
            var canvas = document.createElement("canvas"); //创建一个canvas节点
            var scale = 5; //定义任意放大倍数 支持小数
            canvas.width = width * scale; //定义canvas 宽度 * 缩放
            canvas.height = height * scale; //定义canvas高度 *缩放
            //当前滚动条的位置
            var scrollY = $(document).scrollTop();
            var scrollX = $(document).scrollLeft();
            var  el = document.querySelector(".poster-container");
            console.log(typeof dom[0]);
            html2canvas(dom[0], {
                useCORS: true, //跨域
                allowTaint: false,
                canvas: canvas, //自定义 canvas
                logging: false,
                letterRendering: true,
                taintTest: true, //在渲染前测试图片
                dpi: window.devicePixelRatio, // window.devicePixelRatio是设备像素比
                background: "#0b6cbc",
                width:width,
                height:height,
                scale:scale, // 添加的scale 参数
                scrollY:-scrollY,scrollX:-scrollX
            }).then(function(canvas) {
    
                // canvas.getContext("2d").scale(scale,scale); //获取context,设置scale
                var imgUrl = canvas.toDataURL('image/jpeg');
                document.getElementById('posterImg').setAttribute('src', imgUrl);
                $("#poster-container").hide();
                $(".article").show();
            })
        }
    
        $(".close-img").click(function(){
            $(".toimg").hide();
        })
    </script>
    </body>
    </html>
    
    展开全文
  • Android 开机会出现3个画面: 1. Linux 系统启动,出现Linux小企鹅画面(reboot)...文字字样画面; 3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。 1、开机图片(Linux小企鹅) (A...

    Android 开机会出现3个画面:
    1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);
    2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;
    3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

    1、开机图片(Linux小企鹅) (Android 1.5及以上版本已经取消加载图片);
    Linux Kernel引导启动后,加载该图片。
    logo.c中定义nologo,在fb_find_logo(int depth)函数中根据nologo的值判断是否需要加载相应图片。
    代码如下:
    static int nologo;
    module_param(nologo, bool, 0);
    MODULE_PARM_DESC(nologo, "Disables startup logo");
    /* logo's are marked __initdata. Use __init_refok to tell
    * modpost that it is intended that this function uses data
    * marked __initdata.
    */
    const struct linux_logo * __init_refok fb_find_logo(int depth)
    {
    const struct linux_logo *logo = NULL;
    if (nologo)
    return NULL;
            ......
    }
    相关代码:
    /kernel/drivers/video/fbmem.c
    /kernel/drivers/video/logo/logo.c
    /kernel/drivers/video/logo/Kconfig
    /kernel/include/linux/linux_logo.h

    2、开机文字("A N D R I O D")
    Android 系统启动后,init.c中main()调用load_565rle_image()函数读取/initlogo.rle(一张565 rle压缩的位图),如果读取成功,则在/dev/graphics/fb0显示Logo图片;如果读取失败,则将/dev/tty0设为TEXT模式, 并打开/dev/tty0,输出文本“A N D R I O D”字样。
    定义加载图片文件名称
    #define INIT_IMAGE_FILE "/initlogo.rle"
    int load_565rle_image( char *file_name );
    #endif
    init.c中main()加载/initlogo.rle文件。

     

    if( load_565rle_image(INIT_IMAGE_FILE) ) {//加载initlogo.rle文件
        fd = open("/dev/tty0", O_WRONLY);//将/dev/tty0设为text模式
        if (fd >= 0) {
            const char *msg;
                msg = "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"  // console is 40 cols x 30 lines
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "             A N D R O I D ";
            write(fd, msg, strlen(msg));
            close(fd);
        }
    }
    相关代码: 
    /system/core/init/init.c 
        
    /system/core/init/init.h 
    /system/core/init/init.rc 
    /system/core/init/logo.c 
    *.rle文件的制作步骤: 
    a. 使用GIMP或者Advanced Batch Converter软件,将图象转换为RAW格式; 
    b. 使用android自带的rgb2565工具,将RAW格式文件转换为RLE格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。

     

    3、开机动画(闪动的ANDROID字样的动画图片)
    Android 1.5版本:Android的系统登录动画类似于Windows系统的滚动条,是由前景和背景两张PNG图片组成,这两张图片存在于手机或模拟器 /system/framework/framework-res.apk文件当中,对应原文件位于/frameworks/base/core/res /assets/images/。前景图片(android-logo-mask.png)上的Android文字部分镂空,背景图片(android- logo-shine.png)则是简单的纹理。系统登录时,前景图片在最上层显示,程序代码(BootAnimation.android())控制背 景图片连续滚动,透过前景图片文字镂空部分滚动显示背景纹理,从而实现动画效果。
    相关代码:
    /frameworks/base/libs/surfaceflinger/BootAnimation.h
    /frameworks/base/libs/surfaceflinger/BootAnimation.cpp
    /frameworks/base/core/res/assets/images/android-logo-mask.png  Android默认的前景图片,文字部分镂空,大小256×64
    /frameworks/base/core/res/assets/images/android-logo-shine.png Android默认的背景图片,有动感效果,大小512×64

    Android 1.6及以上版本:
    init.c解析init.rc(其中定义服 务:“service bootanim /system/bin/bootanimation”),bootanim服务由SurfaceFlinger.readyToRun() (property_set("ctl.start", "bootanim");)执行开机动画、bootFinished()(property_set("ctl.stop", "bootanim");)执行停止开机动画。
    BootAnimation.h和BootAnimation.cpp文件放到了 /frameworks/base/cmds/bootanimation目录下了,增加了一个入口文件bootanimation_main.cpp。 Android.mk文件中可以看到,将开机动画从原来的SurfaceFlinger里提取出来了,生成可执行文件:bootanimation。 Android.mk代码如下:
    //=============Android.mk======================
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES:= \
        bootanimation_main.cpp \
        BootAnimation.cpp
    # need "-lrt" on Linux simulator to pick up clock_gettime
    ifeq ($(TARGET_SIMULATOR),true)
        ifeq ($(HOST_OS),linux)
            LOCAL_LDLIBS += -lrt
        endif
    endif
    LOCAL_SHARED_LIBRARIES := \
        libcutils \
        libutils \
        libui \
        libcorecg \
        libsgl \
        libEGL \
        libGLESv1_CM \
        libmedia   
    LOCAL_C_INCLUDES := \
        $(call include-path-for, corecg graphics)
    LOCAL_MODULE:= bootanimation
    include $(BUILD_EXECUTABLE)
    //==========================================
    (1)adb shell后,可以直接运行“bootanimation”来重新看开机动画,它会一直处于动画状态,而不会停止。
    (2)adb shell后,命令“setprop ctl.start bootanim”执行开机动画;命令“getprop ctl.start bootanim”停止开机动画。这两句命令分别对应SurfaceFlinger.cpp的两句语 句:property_set("ctl.start", "bootanim");和property_set("ctl.stop", "bootanim");
    相关文件:
    /frameworks/base/cmds/bootanimation/BootAnimation.h
    /frameworks/base/cmds/bootanimation/BootAnimation.cpp
    /frameworks/base/cmds/bootanimation/bootanimation_main.cpp
    /system/core/init/init.c
    /system/core/rootdir/init.rc
    参考文档:
    图说Android开机画面和开机动画
    http://www.shudoo.com/09/1030/15/13418431.html
    initlogo.rle: display an image on boot
    http://forum.xda-developers.com/showthread.php?t=443431

    分析Android 根文件系统启动过程(init守护进程分析)
    http://crazier9527.javaeye.com/blog/454635

    展开全文
  • 1. 先看一下最终的效果图...文字和编辑框的大小和间距也进行了调整(事实上代码更简洁了,后面会贴出全部的代码) 2. 解决真机调试发生OOM崩溃的问题在正式开始之前,我们先来解决上章(06章)遗留的问题。 虽然上章的
  • ffmpeg做程序的应该很多人都知道,我自己平时用的potplayer据说因为使用了它的代码而不开源被挂上了耻辱柱,前些日子接触到了给视频加水印的需求,大致是要用php使用命令行来执行ffmpeg程序处理视频在下载服务器...
  • 曾记得几年前的网络世界里,随便打开一个网站,首页飘来飘去的图片广告、来回跑动的文字(还带颜色闪烁效果)比比皆是。各大站长将此效果发挥到极限。可是,近年来,大家会发现,那种飘来飘去...
  • 引自...     Rational rose生成代码及其反向工程功能手册(简略翻译+个人补充) 时间:2004-09-21 请参照本blog上另一篇文章http://www.blogbus.com/blogbus/blog/diary.php?diaryid=283921...
  • 该文章主要是通过C#网络编程的webBrowser获取网页中的url并简单的尝试下载网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识、正则表达式实现浏览、获取url、下载图片三个功能.而且...
  • android 开机会出现3个画面:  ...2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;  3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。 1、开机图片(Linux小企鹅) (A
  • PHP动态网站开发插件

    2013-06-18 22:47:24
    插入一条滚动文字,并且可以设置它滚动的方向。 Background that Fit.mxp Download 点击下载 把一张图片作为背景铺满整个浏览器,可随浏览大小的变化自动调整。 URL into layer.mxp Download 点击下载 在你的网页...
  • PHP开发实战1200例源码

    热门讨论 2012-09-22 16:24:59
    实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变页面中单元格的背景颜色 109 实例076 屏蔽偶数次的数据输出 110 实例...
  • dreamweaver上PHP网站开发相关插件

    热门讨论 2009-09-01 14:40:19
    插入一条滚动文字,并且可以设置它滚动的方向。 Background that Fit.mxp 把一张图片作为背景铺满整个浏览器,可随浏览大小的变化自动调整。 URL into layer.mxp 在你的网页里面插入一个层,并且在这个层里面...
  • 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变页面中单元格的背景颜色 109 实例076 屏蔽偶数次的数据输出 110 实例...
  • 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变页面中单元格的背景颜色 109 实例076 屏蔽偶数次的数据输出 110 实例...
  • 25个不错PHP的游戏编程脚本代码分享

    千次阅读 2017-04-13 17:57:07
    本文介绍了25个不错PHP的游戏编程脚本代码,包括简单的掷骰器、随机名称生成器、场景生成器、牌组创建器(Deck builder)和装备(shuffler)、简单的扑克发牌器、Hangman游戏、纵横字谜助手、米德里比斯、乐透机等。...
  • 文字文字占据的空间看做上行高、内容、下行高, 行高部分用透明色, 内容部分用灰色 这样就可以展示原本的文字区域了,对于多行文字而言,显示的就是斑马状条纹形式的骨架屏结构 .line { background-image: ...
  • Requests for PHP 模拟请求库  http://blog.csdn.net/xyang81/article/details/51822252 MYSQL用户权限管理  WeUI 专为微信设计的 UI 库  layer 层展示库 WdatePicker 日期库 jquery.validate.min.js ...
  • 滚动滚动 window上有三个方法 scroll(x,y),scrollTo(x,y) scrollBy(); 三个方法功能类似,用法都是将x,y坐标传入。即实现让滚动滚动到当前位置。 区别:scrollBy()会在之前的数据基础之上做累加。 &...
  • Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片); 2. Android平台启动初始化,出现"A N D R I O D"文字字样画面; 3. And
  • 本文介绍的脚本易于理解、使用简单并可以快速掌握。简单的掷骰器许多游戏和游戏系统都需要骰子。让我们先从简单的部分入手:掷一个六面骰子。实际上,滚动一个六面骰子就是...PHP 提供了更好的随机数字生成器:mt_rand
  • 选择分页位置 按照上述步骤生成了一份PDF文档,但是当PDF页数有很多的时候,会有这样的问题⏬可以看到,分页的时候从这段文字这里懒腰截断了。这显然不是我们想要看到的效果,如何解决这个问题呢????? PDF文档页数...
  • PHP实现邮件发送

    千次阅读 2019-06-16 16:51:59
    PHP环境下,是提供了发送邮件的函数mail()的,不过该函数要求服务器支持sendmail或者必须设置一台不需要中继的邮件发送服务器,但现在要找到一台不需要身份验证的邮件发送中继几乎不可能,所以使用ma...
  • 之前分享过PDF 那些你可能不知道的 PDF 工具 ,这里再分享些好用的图片处理工具。 放大图片 使用AI人工智能将图片放大 https://bigjpg.com/ 除了在线版,还提供桌面软件版。 这是一个通过神经网络,针对放大图片的...
  • 这是过年的时候自己写的js滚动条插件的源码,做出的效果自己并不满意,正因为做的并不满意所以回头重新巩固和深入学习js,这个插件有如下几个不太满意的地方: 内容的过度效果,可以参阅QQ客户端最近会话列表里的...
  • 微信小程序--图片相关问题合辑

    千次阅读 2017-09-20 12:14:01
    图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx....
  • 推荐特效 /jQuery 更多 >09-07 PHP合成多图片08-28 百度地图根据经纬度获取国家、州市等地址相关信息08-06 PHP读取身份证姓名和身份证号码API07-31 cropped仿新浪微博头像上传裁剪缩小放大预览07-29 ...
  • IE标题栏的文字滚动插件.mxp insert_greeting.mxp jump menu插件.mxp Marquee.mxp Meta扩展插件.mxp MX183945_compare_fields.mxp MyComputer.com提供的一套站点访问跟踪系统插件.mxp Oblog 3.0 模板标记插件.mxp ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,213
精华内容 2,485
关键字:

php生成滚动文字图片