位图和SVG用法比较

简介: 位图,亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。

位图,亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。然而,如果从稍远的位置观看它,位图图像的颜色和形状又显得是连续的。

提到SVG,我想大多数人的第一印象是矢量缩放。是的,SVG是制作Logo、图标及按钮的理想选择。和位图不同,SVG可以在不失真情况下进行任意的缩放。同时,和传统Web字体不同的是,SVG可以使用多种颜色、渐变甚至复杂的过滤器来处理文字。

image

位图和SVG有哪些优缺点呢?

图像类型

组成

优点

缺点

位图

像素

只要有足够多的不同色彩的像素,就可以制作出色彩丰富的图象,逼真地表现自然界的景象 缩放和旋转容易失真,同时文件容量较大

SVG

数学向量

文件容量较小,在进行放大、缩小或旋转等操作时图象不会失真 不易制作色彩变化太多的图象

 

下面让我们来对比一下位图和SVG图片使用方法的异同。

 

位图使用方法

位图在Web项目中的应用已经非常成熟了,如果需要常规的图片展示,我们通常不会使用多个图片,而是把需要的图片放置在一张图片中,例如:

image

这个例子里集合8个24×24 图标在一个大小为192×24 图片中。这样做的好处是,我们只需要发送一次 HTTP请求即可下载我们所需要的所有图标,减少浏览器请求并发数的压力,提高网页加载速度,增强用户体验。

当我们需要引用其中一个图标时,我们可以使用以下这段 CSS 代码来显示图片:

#print
{
    width: 24px;
    height: 24px;
    background: url("sprite.png") -168px 0;
}

 

SVG 使用方法

SVG同样可以把多个图像集成到一个文件中。而且在交互性上要优于位图图片;你可以使用图片名称来引用SVG对象,相比于通过手动计算像素位置通过CSS样式定位图片,显然方便了很多。

在使用之前,我们先创建一个很简单的SVG,包含三个独立图标:一个绿色的圆形、一个红色的方形和一个蓝色的三角形。

 

<?xml version="1.0"?>
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
 
<g class="sprite" id="circle">
    <ellipse cy="50" cx="50" ry="45" rx="45" stroke-width="5" stroke="#00ff00" fill="#00ff00" fill-opacity="0.75" />
</g>
 
<g class="sprite" id="square">
    <rect y="5" x="5" width="90" height="90" stroke-width="5" stroke="#ff0000" fill="#ff0000" fill-opacity="0.75" />
</g>
 
<g class="sprite" id="triangle">
    <path d="M20,7 L92,50 L6,93 z" stroke-width="5" stroke="#0000ff" fill="#0000ff" fill-opacity="0.75" />
</g>
 
</svg>

  

XML代码中,每个形状被指定了SpriteClass和ID。当前可以看到一个堆叠效果。如图:

image

有一个小技巧-你可以通过CSS样式来控制只显示当前目标图层,隐藏其它图层:

 

<defs>
    <style><![CDATA[
        .sprite { display: none; }
        .sprite:target { display: inline; }
    ]]></style>
</defs>

 

因此,如果我们可以通过定制链接来显示目标对象,例如,SVG文件名称为 sprite.xml,我们通过在URL中添加哈希值来指定目标对象,如sprite.xml#circle ,我们就可以仅显示圆形所在图层。

我们可以通过很多途径添加 SVG文件,如Object、iframe、img标签或者是作为CSS背景添加(Chrome、Safari和Opera 15+都不支持以img标签或者CSS背景添加形式添加SVG)。

 

<html lang="en">
<head>
<meta charset="utf-8" />

</head>
<style>
body
{
    font-family: sans-serif;
    margin: 10px;
    color: #222;
    background-color: #eee;
}

div.sprite
{
    display: inline-block;
    width: 100px;
    height: 100px;    
}

div#circle { background-image: url("sprite.svg#circle"); }
div#square { background-image: url("sprite.svg#square"); }
div#triangle { background-image: url("sprite.svg#triangle"); }
</style>
<body>

<h2>object</h2>
<object type="image/svg+xml" width="100" height="100" data="sprite.svg#circle"></object>
<object type="image/svg+xml" width="100" height="100" data="sprite.svg#square"></object>
<object type="image/svg+xml" width="100" height="100" data="sprite.svg#triangle"></object>

<h2>iframe</h2>
<iframe src="sprite.svg#circle" width="100" height="100" frameborder="0"></iframe>
<iframe src="sprite.svg#square" width="100" height="100" frameborder="0"></iframe>
<iframe src="sprite.svg#triangle" width="100" height="100" frameborder="0"></iframe>

<h2>img</h2>
<img src="sprite.svg#circle" width="100" height="100" />
<img src="sprite.svg#square" width="100" height="100" />
<img src="sprite.svg#triangle" width="100" height="100" />

<h2>CSS background</h2>
<div id="circle" class="sprite"></div>
<div id="square" class="sprite"></div>
<div id="triangle" class="sprite"></div>

</body>
</html>

 

IE9和Chrome中看到的效果如下:

image image


通过以上的描述,你现在大概了解 SVG 的使用方法及优势了吧?尽管它是如此的实用,但是关于SVG技术的前景众说纷纭。尽管SVG具有可扩展、易交互并且节省网

络资源等诸多优势,SVG还是没有在Web项目中被广泛应用。这是什么原因呢?

  • SVG 不支持早期的 IE 浏览器 -仅支持IE9及更高版本。
  • SVG诞生于1999年-至今仍然不温不火,给人感觉像一门既古老又不受欢迎的技术。
  • 设计工具稀少-导致使用起来很困难。
  • SVG基于XML-给大多初学者的印象很复杂,望而却步。

SVG将何去何从,让我们拭目以待。

相关文章
|
前端开发 数据可视化 JavaScript
【第50期】一文读懂React可视化
【第50期】一文读懂React可视化
270 0
halcon的灰度变换(图像增强)
halcon的灰度变换(图像增强)
938 1
|
自然语言处理 Java Go
项目总监必看:如何利用Git深度统计团队代码贡献?多语言实践教程揭秘!
项目总监必看:如何利用Git深度统计团队代码贡献?多语言实践教程揭秘!
666 0
|
消息中间件 监控 Java
Kafka Producer异步发送消息技巧大揭秘
Kafka Producer异步发送消息技巧大揭秘
1009 0
|
前端开发 程序员 开发工具
解决Material Theme UI插件收费问题
解决Material Theme UI插件收费问题
解决Material Theme UI插件收费问题
|
人工智能 网络协议 应用服务中间件
Golang 搭建 WebSocket 应用(一) - 初识 gorilla/websocket
Golang 搭建 WebSocket 应用(一) - 初识 gorilla/websocket
1296 1
|
Go
一文吃透Go语言bool用法 不懂布尔看这里!
一文吃透Go语言bool用法 不懂布尔看这里!
1426 0
|
传感器 机器人 C++
机器人操作系统ROS 编程开发--详细总结
最近工作涉及到自动驾驶的,需要学习ROS,学习中总结了一些知识点,分享给大家。 机器人操作系统ROS,是一种分布式处理框架(又名Nodes),ROS常用C++和python编程语言开发;(这里项目开发采用C++ 11版本)。ROS的点对点设计以及服务和节点管理器等机制,可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。ROS免费并且开源。
2518 0
|
存储 NoSQL Java
场景应用:利用Redis实现分布式Session
场景应用:利用Redis实现分布式Session
3280 0
|
Web App开发 开发框架 前端开发
Electron快速入手,拥有自己的第一个桌面应用
Electron 是一个跨平台的、基于 Web 前端技术的桌面 GUI 应用程序开发框架。 支持 Web 技术开发桌面应用,其本身是基于 C++ 开发的,GUI 核心来自于 Chrome,而 JavaScript 引擎使用 v8。 这使得我们使用前端技术就可以开发出属于自己的第一个桌面应用。
582 0