中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

使用PHP+JavaScript將HTML頁面轉換為圖片的實例分享
來源:易賢網 閱讀:1745 次 日期:2016-07-08 10:07:42
溫馨提示:易賢網小編為您整理了“使用PHP+JavaScript將HTML頁面轉換為圖片的實例分享”,方便廣大網友查閱!

這篇文章主要介紹了使用PHP+JavaScript將HTML元素轉換為圖片的實例分享,文后結果的截圖只能體現出替換的字體,也不能說將靜態頁面轉為圖片可以加快加載,只是這種做法比較interesting XD需要的朋友可以參考下

1,準備要素

1)替換字體的js文件

js代碼:

function com_stewartspeak_replacement() {

/*

  Dynamic Heading Generator

  By Stewart Rosenberger

  http://www.stewartspeak.com/headings/

  This script searches through a web page for specific or general elements

  and replaces them with dynamically generated images, in conjunction with

  a server-side script.

*/

replaceSelector("h1","dynatext/heading.php",true);//前兩個參數需要修改

var testURL = "dynatext/loading.gif" ;//修改為對應的圖片路徑

var doNotPrintImages = false;

var printerCSS = "replacement-print.css";

var hideFlicker = false;

var hideFlickerCSS = "replacement-screen.css";

var hideFlickerTimeout = 100;//這里可以做相應的修改

/* ---------------------------------------------------------------------------

  For basic usage, you should not need to edit anything below this comment.

  If you need to further customize this script's abilities, make sure

  you're familiar with Javascript. And grab a soda or something.

*/

var items;

var imageLoaded = false;

var documentLoaded = false;

function replaceSelector(selector,url,wordwrap)

{

  if(typeof items == "undefined")

    items = new Array();

  items[items.length] = {selector: selector, url: url, wordwrap: wordwrap};

}

if(hideFlicker)

{    

  document.write('<link id="hide-flicker" rel="stylesheet" media="screen" href="' + hideFlickerCSS + '" />');    

  window.flickerCheck = function()

  {

    if(!imageLoaded)

      setStyleSheetState('hide-flicker',false);

  };

  setTimeout('window.flickerCheck();',hideFlickerTimeout)

}

if(doNotPrintImages)

  document.write('<link id="print-text" rel="stylesheet" media="print" href="' + printerCSS + '" />');

var test = new Image();

test.onload = function() { imageLoaded = true; if(documentLoaded) replacement(); };

test.src = testURL + "?date=" + (new Date()).getTime();

addLoadHandler(function(){ documentLoaded = true; if(imageLoaded) replacement(); });

function documentLoad()

{

  documentLoaded = true;

  if(imageLoaded)

    replacement();

}

function replacement()

{

  for(var i=0;i<items.length;i++)

  {

    var elements = getElementsBySelector(items[i].selector);

    if(elements.length > 0) for(var j=0;j<elements.length;j++)

    {

      if(!elements[j])

        continue ;

      

      var text = extractText(elements[j]);

      while(elements[j].hasChildNodes())

        elements[j].removeChild(elements[j].firstChild);

      var tokens = items[i].wordwrap ? text.split(' ') : [text] ;

      for(var k=0;k<tokens.length;k++)

      {

        var url = items[i].url + "?text="+escape(tokens[k]+' ')+"&selector="+escape(items[i].selector);

        var image = document.createElement("img");

        image.className = "replacement";

        image.alt = tokens[k] ;

        image.src = url;

        elements[j].appendChild(image);

      }

      if(doNotPrintImages)

      {

        var span = document.createElement("span");

        span.style.display = 'none';

        span.className = "print-text";

        span.appendChild(document.createTextNode(text));

        elements[j].appendChild(span);

      }

    }

  }

  if(hideFlicker)

    setStyleSheetState('hide-flicker',false);

}

function addLoadHandler(handler)

{

  if(window.addEventListener)

  {

    window.addEventListener("load",handler,false);

  }

  else if(window.attachEvent)

  {

    window.attachEvent("onload",handler);

  }

  else if(window.onload)

  {

    var oldHandler = window.onload;

    window.onload = function piggyback()

    {

      oldHandler();

      handler();

    };

  }

  else

  {

    window.onload = handler;

  }

}

function setStyleSheetState(id,enabled) 

{

  var sheet = document.getElementById(id);

  if(sheet)

    sheet.disabled = (!enabled);

}

function extractText(element)

{

  if(typeof element == "string")

    return element;

  else if(typeof element == "undefined")

    return element;

  else if(element.innerText)

    return element.innerText;

  var text = "";

  var kids = element.childNodes;

  for(var i=0;i<kids.length;i++)

  {

    if(kids[i].nodeType == 1)

    text += extractText(kids[i]);

    else if(kids[i].nodeType == 3)

    text += kids[i].nodeValue;

  }

  return text;

}

/*

  Finds elements on page that match a given CSS selector rule. Some

  complicated rules are not compatible.

  Based on Simon Willison's excellent "getElementsBySelector" function.

  Original code (with comments and description):

    http://simon.incutio.com/archive/2003/03/25/getElementsBySelector

*/

function getElementsBySelector(selector)

{

  var tokens = selector.split(' ');

  var currentContext = new Array(document);

  for(var i=0;i<tokens.length;i++)

  {

    token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');

    if(token.indexOf('#') > -1)

    {

      var bits = token.split('#');

      var tagName = bits[0];

      var id = bits[1];

      var element = document.getElementById(id);

      if(tagName && element.nodeName.toLowerCase() != tagName)

        return new Array();

      currentContext = new Array(element);

      continue;

    }

    if(token.indexOf('.') > -1)

    {

      var bits = token.split('.');

      var tagName = bits[0];

      var className = bits[1];

      if(!tagName)

        tagName = '*';

      var found = new Array;

      var foundCount = 0;

      for(var h=0;h<currentContext.length;h++)

      {

        var elements;

        if(tagName == '*')

          elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');

        else

          elements = currentContext[h].getElementsByTagName(tagName);

        for(var j=0;j<elements.length;j++)

          found[foundCount++] = elements[j];

      }

      currentContext = new Array;

      var currentContextIndex = 0;

      for(var k=0;k<found.length;k++)

      {

        if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b')))

          currentContext[currentContextIndex++] = found[k];

      }

      continue;

    }

    if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/))

    {

      var tagName = RegExp.$1;

      var attrName = RegExp.$2;

      var attrOperator = RegExp.$3;

      var attrValue = RegExp.$4;

      if(!tagName)

        tagName = '*';

      var found = new Array;

      var foundCount = 0;

      for(var h=0;h<currentContext.length;h++)

      {

        var elements;

        if(tagName == '*')

          elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');

        else

          elements = currentContext[h].getElementsByTagName(tagName);

        for(var j=0;j<elements.length;j++)

          found[foundCount++] = elements[j];

      }

      currentContext = new Array;

      var currentContextIndex = 0;

      var checkFunction;

      switch(attrOperator)

      {

        case '=':

          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };

          break;

        case '~':

          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };

          break;

        case '|':

          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };

          break;

        case '^':

          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };

          break;

        case '$':

          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };

          break;

        case '*':

          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };

          break;

        default :

          checkFunction = function(e) { return e.getAttribute(attrName); };

      }

      currentContext = new Array;

      var currentContextIndex = 0;

      for(var k=0;k<found.length;k++)

      {

        if(checkFunction(found[k]))

          currentContext[currentContextIndex++] = found[k];

      }

      continue;

    }

    tagName = token;

    var found = new Array;

    var foundCount = 0;

    for(var h=0;h<currentContext.length;h++)

    {

      var elements = currentContext[h].getElementsByTagName(tagName);

      for(var j=0;j<elements.length; j++)

        found[foundCount++] = elements[j];

    }

    currentContext = found;

  }

  return currentContext;

}

}// end of scope, execute code

if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i))

  com_stewartspeak_replacement();

2)生成圖片的php文件

<?php

/*

  Dynamic Heading Generator

  By Stewart Rosenberger

  http://www.stewartspeak.com/headings/  

  This script generates PNG images of text, written in

  the font/size that you specify. These PNG images are passed

  back to the browser. Optionally, they can be cached for later use. 

  If a cached image is found, a new image will not be generated,

  and the existing copy will be sent to the browser.

  Additional documentation on PHP's image handling capabilities can

  be found at http://www.php.net/image/  

*/

$font_file = 'trebuc.ttf' ;//可以做相應的xiuga

$font_size = 23 ;//可以做相應的修改

$font_color = '#000000' ;

$background_color = '#ffffff' ;

$transparent_background = true ;

$cache_images = true ;

$cache_folder = 'cache' ;

/*

 ---------------------------------------------------------------------------

  For basic usage, you should not need to edit anything below this comment.

  If you need to further customize this script's abilities, make sure you

  are familiar with PHP and its image handling capabilities.

 ---------------------------------------------------------------------------

*/

$mime_type = 'image/png' ;

$extension = '.png' ;

$send_buffer_size = 4096 ;

// check for GD support

if(!function_exists('ImageCreate'))

  fatal_error('Error: Server does not support PHP image generation') ;

// clean up text

if(empty($_GET['text']))

  fatal_error('Error: No text specified.') ;

    

$text = $_GET['text'] ;

if(get_magic_quotes_gpc())

  $text = stripslashes($text) ;

$text = javascript_to_html($text) ;

// look for cached copy, send if it exists

$hash = md5(basename($font_file) . $font_size . $font_color .

      $background_color . $transparent_background . $text) ;

$cache_filename = $cache_folder . '/' . $hash . $extension ;

if($cache_images && ($file = @fopen($cache_filename,'rb')))

{

  header('Content-type: ' . $mime_type) ;

  while(!feof($file))

    print(($buffer = fread($file,$send_buffer_size))) ;

  fclose($file) ;

  exit ;

}

// check font availability

$font_found = is_readable($font_file) ;

if(!$font_found)

{

  fatal_error('Error: The server is missing the specified font.') ;

}

// create image

$background_rgb = hex_to_rgb($background_color) ;

$font_rgb = hex_to_rgb($font_color) ;

$dip = get_dip($font_file,$font_size) ;

$box = @ImageTTFBBox($font_size,0,$font_file,$text) ;

$image = @ImageCreate(abs($box[2]-$box[0]),abs($box[5]-$dip)) ;

if(!$image || !$box)

{

  fatal_error('Error: The server could not create this heading image.') ;

}

// allocate colors and draw text

$background_color = @ImageColorAllocate($image,$background_rgb['red'],

  $background_rgb['green'],$background_rgb['blue']) ;

$font_color = ImageColorAllocate($image,$font_rgb['red'],

  $font_rgb['green'],$font_rgb['blue']) ;  

ImageTTFText($image,$font_size,0,-$box[0],abs($box[5]-$box[3])-$box[1],

  $font_color,$font_file,$text) ;

// set transparency

if($transparent_background)

  ImageColorTransparent($image,$background_color) ;

header('Content-type: ' . $mime_type) ;

ImagePNG($image) ;

// save copy of image for cache

if($cache_images)

{

  @ImagePNG($image,$cache_filename) ;

}

ImageDestroy($image) ;

exit ;

/*

  try to determine the "dip" (pixels dropped below baseline) of this

  font for this size.

*/

function get_dip($font,$size)

{

  $test_chars = 'abcdefghijklmnopqrstuvwxyz' .

         'ABCDEFGHIJKLMNOPQRSTUVWXYZ' .

         '1234567890' .

         '!@#$%^&*()\'"\\/;.,`~<>[]{}-+_-=' ;

  $box = @ImageTTFBBox($size,0,$font,$test_chars) ;

  return $box[3] ;

}

/*

  attempt to create an image containing the error message given. 

  if this works, the image is sent to the browser. if not, an error

  is logged, and passed back to the browser as a 500 code instead.

*/

function fatal_error($message)

{

  // send an image

  if(function_exists('ImageCreate'))

  {

    $width = ImageFontWidth(5) * strlen($message) + 10 ;

    $height = ImageFontHeight(5) + 10 ;

    if($image = ImageCreate($width,$height))

    {

      $background = ImageColorAllocate($image,255,255,255) ;

      $text_color = ImageColorAllocate($image,0,0,0) ;

      ImageString($image,5,5,5,$message,$text_color) ;  

      header('Content-type: image/png') ;

      ImagePNG($image) ;

      ImageDestroy($image) ;

      exit ;

    }

  }

  // send 500 code

  header("HTTP/1.0 500 Internal Server Error") ;

  print($message) ;

  exit ;

}

/* 

  decode an HTML hex-code into an array of R,G, and B values.

  accepts these formats: (case insensitive) #ffffff, ffffff, #fff, fff 

*/ 

function hex_to_rgb($hex)

{

  // remove '#'

  if(substr($hex,0,1) == '#')

    $hex = substr($hex,1) ;

  // expand short form ('fff') color

  if(strlen($hex) == 3)

  {

    $hex = substr($hex,0,1) . substr($hex,0,1) .

        substr($hex,1,1) . substr($hex,1,1) .

        substr($hex,2,1) . substr($hex,2,1) ;

  }

  if(strlen($hex) != 6)

    fatal_error('Error: Invalid color "'.$hex.'"') ;

  // convert

  $rgb['red'] = hexdec(substr($hex,0,2)) ;

  $rgb['green'] = hexdec(substr($hex,2,2)) ;

  $rgb['blue'] = hexdec(substr($hex,4,2)) ;

  return $rgb ;

}

/*

  convert embedded, javascript unicode characters into embedded HTML

  entities. (e.g. '%u2018' => '‘'). returns the converted string.

*/

function javascript_to_html($text)

{

  $matches = null ;

  preg_match_all('/%u([0-9A-F]{4})/i',$text,$matches) ;

  if(!empty($matches)) for($i=0;$i<sizeof($matches[0]);$i++)

    $text = str_replace($matches[0][$i],

              '&#'.hexdec($matches[1][$i]).';',$text) ;

  return $text ;

}

?>

3)需要的字體

這里將需要的自己放在與js和php文件同在的一個目錄下(也可以修改,但是對應文件也要修改)

4)PHP的GD2庫

2,實現的html代碼

<?php

//load the popup utils library

//require_once 'include/popup_utils.inc.php';

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html>

  <head>

    <title>

      Professional Search Engine Optimization with PHP: Table of Contents

    </title>

    <script type="text/javascript" language="javascript" src="dynatext/replacement.js"></script>

  </head>

  <body onload="window.resizeTo(800,600);" onresize='setTimeout("window.resizeTo(800,600);", 100)'>

    <h1>

      Professional Search Engine Optimization with PHP: Table of Contents

    </h1>

    <?php

      //display popup navigation only when visitor comes from a SERP

      // display_navigation();

      //display_popup_navigation();

    ?>

    <ol>

      <li>You: Programmer and Search Engine Marketer</li>

      <li>A Primer in Basic SEO</li>

      <li>Provocative SE-Friendly URLs</li>

      <li>Content Relocation and HTTP Status Codes</li>

      <li>Duplicate Content</li>

      <li>SE-Friendly HTML and JavaScript</li>

      <li>Web Syndication and Social Bookmarking</li>

      <li>Black Hat SEO</li>

      <li>Sitemaps</li>

      <li>Link Bait</li>

      <li>IP Cloaking, Geo-Targeting, and IP Delivery</li>

      <li>Foreign Language SEO</li>

      <li>Coping with Technical Issues</li>

      <li>Site Clinic: So You Have a Web Site?</li>

      <li>WordPress: Creating a SE-Friendly Weblog?</li>

      <li>Introduction to Regular Expression</li>

    </ol>

  </body>

</html>

3,使用效果前后對比

使用前

名單

使用后

名單

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
日韩视频免费在线| 欧美性片在线观看| 男男成人高潮片免费网站| 国产在线拍揄自揄视频不卡99| 国产亚洲精品aa| 久色成人在线| 一区二区三区高清视频在线观看| 欧美精品在线网站| 午夜在线成人av| 亚洲国产免费| 国产精品大片免费观看| 欧美在线免费| 亚洲免费成人av电影| 国产欧美在线观看一区| 蜜臀av一级做a爰片久久| 9l国产精品久久久久麻豆| 国产欧美视频一区二区| 欧美大片免费久久精品三p | 免费av成人在线| 日韩一区二区电影网| 国产亚洲激情| 欧美日韩午夜剧场| 快播亚洲色图| 翔田千里一区二区| 一区二区三区欧美视频| 曰韩精品一区二区| 国产精品丝袜91| 欧美区在线播放| 久久视频一区| 羞羞视频在线观看欧美| 99一区二区| 最新国产精品拍自在线播放| 国产日韩av高清| 欧美先锋影音| 欧美日韩伦理在线| 欧美大学生性色视频| 久久精品二区亚洲w码| 野花国产精品入口| 亚洲福利视频免费观看| 国产亚洲人成网站在线观看| 欧美视频日韩| 欧美日韩激情小视频| 欧美1区2区视频| 久久人人超碰| 欧美中在线观看| 欧美一区二区三区精品| 亚洲自拍16p| 亚洲一区二区成人| 亚洲视频精品在线| 妖精成人www高清在线观看| 亚洲国产欧美另类丝袜| 在线欧美福利| 亚洲国产精品一区二区尤物区| 国产欧美一区二区精品婷婷 | 久久午夜电影网| 香蕉久久精品日日躁夜夜躁| 亚洲视频在线观看网站| 一二三区精品| 亚洲一区二区视频在线| 亚洲欧美一区二区三区在线| 中文无字幕一区二区三区| 一二三区精品福利视频| 亚洲小说区图片区| 亚洲在线视频免费观看| 午夜精品一区二区在线观看 | 伊人久久综合| 亚洲大胆在线| 亚洲精选大片| 一区二区三区日韩精品视频| 一区二区三区视频在线| 亚洲男同1069视频| 欧美在线免费观看亚洲| 久久久一二三| 欧美日韩成人一区二区三区| 欧美性大战久久久久| 国产日韩欧美日韩| 亚洲高清在线观看一区| av不卡免费看| 欧美一级大片在线观看| 久久综合九色九九| 欧美三级免费| 国产一区二区在线观看免费播放 | 欧美久久精品午夜青青大伊人| 久热精品视频在线| 欧美精品一区二区三区久久久竹菊| 免费欧美视频| 国产精品成人免费精品自在线观看| 国产精品va在线播放| 国产人成一区二区三区影院| 影音先锋亚洲电影| 亚洲美女色禁图| 久久精品国产亚洲精品| 欧美精品久久天天躁| 国产老肥熟一区二区三区| 亚洲激情亚洲| 欧美一级视频免费在线观看| 女女同性精品视频| 国产精品久久久久一区二区三区共| 国产精品有限公司| 亚洲狼人综合| 久久精品国产精品亚洲| 欧美日韩激情小视频| 国产一区二区主播在线| a91a精品视频在线观看| 久久婷婷国产麻豆91天堂| 国产精品成人国产乱一区| 亚洲全黄一级网站| 久久国产99| 国产精品亚洲一区二区三区在线| 欧美精品入口| 国产专区一区| 欧美777四色影视在线| 在线观看中文字幕不卡| 欧美影院一区| 巨胸喷奶水www久久久免费动漫| 久久久精品tv| 亚洲精品国产精品久久清纯直播| 国产精品麻豆va在线播放| 欧美中文在线观看国产| 一区二区三区日韩精品| 国产一区白浆| 亚洲男女毛片无遮挡| 欧美日韩高清在线观看| 欧美极品影院| 欧美黄在线观看| 亚洲男人的天堂在线| 国产在线麻豆精品观看| 欧美午夜精品一区二区三区| 亚洲一区999| 精品成人一区| 亚洲一区二区三区在线播放| 亚洲国产精品一区二区www在线| 鲁鲁狠狠狠7777一区二区| 亚洲国产日韩一区| 国产伦精品一区二区三区高清| 亚洲一区二区三区精品动漫| 亚洲第一精品夜夜躁人人爽| 亚洲精品视频啊美女在线直播| 国产精品一区二区你懂得| 欧美日韩系列| 狠狠综合久久| 在线看片成人| 亚洲一区二区免费视频| 欧美大香线蕉线伊人久久国产精品| 日韩西西人体444www| 日韩特黄影片| 看片网站欧美日韩| 欧美视频网址| 国产精品视屏| 国产日韩精品入口| 亚洲激情校园春色| 久久精品91| 久久成人精品电影| 欧美一区二区三区电影在线观看| 亚洲午夜精品久久久久久浪潮| 国内久久精品视频| 国产日产欧美a一级在线| 国产日韩欧美在线| 亚洲精品视频啊美女在线直播| 国产欧美亚洲精品| 夜夜嗨网站十八久久| 欧美在线观看一区二区| 欧美日本韩国一区二区三区| 国产亚洲欧美在线| 亚洲一区图片| 久久免费视频在线| 欧美日韩一区免费| 亚洲二区免费| 欧美国产精品人人做人人爱| 99精品福利视频| 久久久91精品国产| 国产欧美日韩一区二区三区在线观看 | 欧美一区激情| 韩国av一区二区| 国产精品夜夜夜一区二区三区尤| 亚洲精品五月天| 久久精品99国产精品酒店日本| 欧美精品在线观看播放| 国产香蕉久久精品综合网| 欧美一区二区三区电影在线观看| 国产精品第2页| 久久se精品一区二区| 在线观看欧美亚洲| 欧美视频在线一区| 你懂的成人av| 亚洲欧美日韩人成在线播放| 亚洲国产精品嫩草影院| 国产手机视频精品| 欧美激情视频一区二区三区不卡| 日韩视频一区| 国产一区二区三区四区五区美女 | 在线视频一区观看| 国产精品盗摄久久久| 久久久久久久欧美精品| 亚洲一区二区三区视频播放| 亚洲欧洲一区二区三区在线观看| 欧美调教vk| 欧美日韩免费看| 久热精品视频在线| 久久久国产精品一区|