html用转义字符画菱形,JavaScript生成字符画(ASCII Art)

今天玩一些新的东西,大家都没有看过这样的视频:

或者 这样的图片:

0b6dcf62ef991c3e68264dd0cdf494cb.png

网上有很多生成这种图片/视频的工具,但是每个程序员都有一颗造轮子的心,我们当然要玩出自己的花样啦。老规矩,还是先讲原理,建议先用自己的方式实现一遍。原理很简单首先准备一组排好序的不同 “着色密度 ” 的ascii字符(事实上你可以用任何字符),比如 #KDGLftji+;,:. ,接着将源图转为灰度图,然后遍历图中的像素,根据r/g/b通道的值来匹配字符串中相应 “着色密度 ” 的字符,值越小则颜色越深,字符的“密度”也应越大。如果需要保留颜色,只需将灰度图和原图的像素位置一一对应即可。在开始实现功能之前,我们需要先了解一下颜色矩阵(ColorMatrix)。在计算机中,每个像素的颜色可以用一个向量(有的文章也叫矢量或分量)矩阵表示:[R, G, B, A]。颜色变换矩阵通常是用一个5x5的矩阵来表示,和空间中一个n维向量的平移变换需要用一个n+1维的矩阵来表示一样,颜色矩阵也需要引入一个齐次坐标来进行“平移操作”。以下是一些常见的颜色变换矩阵:

亮度矩阵

R

G

B

A

W

R

1

0

0

0

b

G

0

1

0

0

b

B

0

0

1

0

b

A

0

0

0

1

0

W

0

0

0

0

1

反色矩阵

R

G

B

A

W

R

-1

0

0

255

0

G

0

-1

0

255

0

B

0

0

-1

255

0

A

0

0

0

1

0

W

0

0

0

0

1

灰度矩阵

R

G

B

A

W

R

0.3086

0.6094

0.0820

0

0

G

0.3086

0.6094

0.0820

0

0

B

0.3086

0.6094

0.0820

0

0

A

0

0

0

1

0

W

0

0

0

0

1

ps:将像素去色的原理是使R=G=B,同时为了保持亮度不变,须使R+G+B尽量等于1 ,理论上来说要平分R、G、B通道值,应该是(R+B+G)/3,即系数应该约为0.3333才对,之所以比例不同,按照网上的解释,

这个比例主要是根据人眼中三种不同的感光细胞的感光强度比例分配的

还有一组比较常用的比例是0.2125,0.7154,0.0721,至于怎么来的还希望哪位大佬指点迷津。

下面是页面的html结构

ascii art

* {

margin: 0;

padding: 0;

}

canvas, img, #container {

display: block;

margin: auto;

}

#container {

line-height: 12px;

font-size: 12px;

font-family: 'SimHei', monospace;

letter-spacing: 6px;

}

trump.png

(function () {

// 这里是js代码

})()

解释一下几个关键点,首先我们输出的文字必须是等宽字体,我这里使用的是黑体:font-family: 'SimHei', monospace; 别忘了加上fallback:monospace。等宽字体是指每个字宽高都固定的字体,这里的固定宽高是指同一种文字,比如中文的黑体宽度是英文的两倍,其他字体我没有试过,大家可以自己去实验。这也是我设置了 letter-spacing: 6px; 的原因:当黑体设置了font-size=line-height时,中文是宽高相等,英文宽是高的一半。

接下来是js代码:

var container = document.getElementById('container')

var offScreenCvs = document.createElement('canvas') // 创建离屏canvas

var offScreenCtx = offScreenCvs.getContext('2d', { alpha: false }) // 关闭透明度

var offScreenCvsWidth, offScreenCvsHeight

var samplerStep = 4 // 采样间隔

var img = new Image()

var onImgLoaded = function () {

offScreenCvsWidth = img.width

offScreenCvsHeight = img.height

offScreenCvs.width = offScreenCvsWidth

offScreenCvs.height = offScreenCvsHeight

offScreenCtx.drawImage(img, 0, 0, offScreenCvsWidth, offScreenCvsHeight)

imageData = offScreenCtx.getImageData(0, 0, offScreenCvsWidth, offScreenCvsHeight)

// 采样点数 = 图片宽度 / 采样间隔;容器边长 = 采样点数 × 字体大小

container.style.width = (offScreenCvsWidth / samplerStep * 12) + 'px'

container.style.height = (offScreenCvsHeight / samplerStep * 12) + 'px'

render()

}

img.src = './trump.png'

img.complete ? onImgLoaded() : (img.onload = onImgLoaded) // 确保onImgLoaded被执行

var imageData

var x, y, pos

var asciiCharArray = '#KDGLftji+;,:.'.split('') // 准备不同密度的字符数组(降序)

var durationPerChar = Math.ceil(255 / asciiCharArray.length) // 每个字符代表的密度阈值

function render () {

var imageDataContent = imageData.data

var strArray = []

var part1, part2

var letter

var value

for (y = 0; y < offScreenCvsHeight; y += samplerStep) {

strArray.push('

') // 使用P标签换行

for (x = 0; x < offScreenCvsWidth; x += samplerStep) {

pos = y * offScreenCvsWidth + x

// 获取RBG加权平均后的灰度值

value = imageDataContent[pos * 4] * 0.3086 + imageDataContent[pos * 4 + 1] * 0.6094 + imageDataContent[pos * 4 + 2] * 0.0820

imageDataContent[pos * 4] = imageDataContent[pos * 4 + 1] = imageDataContent[pos * 4 + 2] = value

// 判断灰度值落在那个密度范围中,拿到对应的字符

part1 = Math.floor(value / durationPerChar)

part2 = value % durationPerChar

letter = part2 ? asciiCharArray[part1] : (part1 ? asciiCharArray[part1 - 1] : 'æ')

strArray.push(letter)

}

strArray.push('

')

}

container.innerHTML = strArray.join('')

}

先解释一下这行:img.complete ? onImgLoaded() : (img.onload = onImgLoaded)

通常来说img.onload = 必须要放在 img.src = 之前,来保证onload回调一定会执行,否则的话如果图片在执行这段代码之前已经被浏览器缓存了,则有可能不会触发onload回调。但是有时候由于业务的需要,有些操作必须要在图片载入完成后执行,可是不一定立即执行,碰到这种情况,就可以用到Image对象的complete属性,该属性会返回当前图片是否加载完成的bollean值。于是,通过上面这行代码,就可以确保onImgLoaded函数在图片载入完成后一定会被触发。(本案例该写法不必须,但是建议养成这个习惯)

上面实际上已经完成了核心的功能,接下来对我们的代码做一些优化——

如果我们需要提供改变字体大小的功能怎么办?可以先直接把字体大小相关的字面值抽出为一个变量,如fontSize :

...

...

var fontSize = 18 // 字体大小

...

...

var onImgLoaded = function () {

...

...

container.style.width = (offScreenCvsWidth / samplerStep * fontSize) + 'px'

container.style.height = (offScreenCvsHeight / samplerStep * fontSize) + 'px'

container.style.fontSize = fontSize + 'px'

container.style.lineHeight = fontSize + 'px'

container.style.letterSpacing = (fontSize / 2) + 'px' // SimHei体英文宽是高的一半

render()

}

但是PC浏览器不允许字体小于12px怎么办呢?我们可以用css的scale来缩放容器就行了,修改代码如下:

...

var onImgLoaded = function () {

...

...

imageData = offScreenCtx.getImageData(0, 0, offScreenCvsWidth, offScreenCvsHeight)

if (fontSize < 12) {

// 小于12px则将字体改为12px并通过 transform scale 进行缩放

container.style.transform = 'scale(' + (fontSize / 12) + ')'

container.style.transformOrigin = '50% 0'

fontSize = 12

}

container.style.width = (offScreenCvsWidth * fontSize / samplerStep) + 'px'

...

...

}

...

好了,现在我们生成的是灰色的图,但是如何生成彩色的图呢,估计大家第一反应就是给每个字外面包一层标签(比如span、font),但是笔者试了之后发现一旦图片尺寸稍微大一些,性能下降非常夸张,一度把我的浏览器给弄崩溃了(╥╯^╰╥),小伙伴们可以自行尝试。于是我打算用canvas来做渲染而不是使用开销极大的dom,上面的代码大部分可以重用,我修改了一下后的html结构:

ascii art

* {

margin: 0;

padding: 0;

}

canvas, img {

display: block;

margin: auto;

}

trump.png

(function () {

// canvas 实现

})()

这是js代码:

var offScreenCvs = document.createElement('canvas')

var offScreenCtx = offScreenCvs.getContext('2d', { alpha: false })

var asciiCvs = document.getElementById('ascii-canvas')

var asciiCtx = asciiCvs.getContext('2d', { alpha: false })

var offScreenCvsWidth, offScreenCvsHeight, asciiCvsWidth, asciiCvsHeight

var fontSize = 8

var samplerStep = 4

var img = new Image()

var onImgLoaded = function () {

offScreenCvsWidth = img.width

offScreenCvsHeight = img.height

offScreenCvs.width = offScreenCvsWidth

offScreenCvs.height = offScreenCvsHeight

offScreenCtx.drawImage(img, 0, 0, offScreenCvsWidth, offScreenCvsHeight)

imageData = offScreenCtx.getImageData(0, 0, offScreenCvsWidth, offScreenCvsHeight)

asciiCvsWidth = offScreenCvsWidth / samplerStep * fontSize

asciiCvsHeight = (offScreenCvsHeight / samplerStep + 1) * fontSize

asciiCvs.width = asciiCvsWidth

asciiCvs.height = asciiCvsHeight

render()

}

img.src = './trump.png'

img.complete ? onImgLoaded() : (img.onload = onImgLoaded)

var imageData

var x, y, _x, _y, pos

var asciiCharArray = '#KDGLftji+;,:.'.split('')

var durationPerChar = Math.ceil(255 / asciiCharArray.length)

function render () {

var imageDataContent = imageData.data

var part1, part2

var letter

var value

asciiCtx.fillStyle = '#ffffff'

asciiCtx.fillRect(0, 0, asciiCvsWidth, asciiCvsHeight)

asciiCtx.fillStyle = '#000000'

asciiCtx.font = fontSize + 'px SimHei'

for (y = 0, _y = 0; y < offScreenCvsHeight; y += samplerStep, _y++) {

for (x = 0, _x = 0; x < offScreenCvsWidth; x += samplerStep, _x++) {

pos = y * offScreenCvsWidth + x

value = imageDataContent[pos * 4] * 0.3086 + imageDataContent[pos * 4 + 1] * 0.6094 + imageDataContent[pos * 4 + 2] * 0.0820

imageDataContent[pos * 4] = imageDataContent[pos * 4 + 1] = imageDataContent[pos * 4 + 2] = value

part1 = Math.floor(value / durationPerChar)

part2 = value % durationPerChar

letter = part2 ? asciiCharArray[part1] : (part1 ? asciiCharArray[part1 - 1] : 'æ')

asciiCtx.fillText(letter, _x * fontSize, (_y + 1) * fontSize)

}

}

}

完美,接下来给文字上色:

...

...

var x, y, _x, _y, pos

var r, g, b

var asciiCharArray = '#KDGLftji+;,:.'.split('')

...

...

function render () {

...

...

for (y = 0, _y = 0; y < offScreenCvsHeight; y += samplerStep, _y++) {

for (x = 0, _x = 0; x < offScreenCvsWidth; x += samplerStep, _x++) {

pos = y * offScreenCvsWidth + x

r = imageDataContent[pos * 4]

g = imageDataContent[pos * 4 + 1]

b = imageDataContent[pos * 4 + 2]

value = r * 0.3086 + g * 0.6094 + b * 0.0820

imageDataContent[pos * 4] = imageDataContent[pos * 4 + 1] = imageDataContent[pos * 4 + 2] = value

part1 = Math.floor(value / durationPerChar)

part2 = value % durationPerChar

letter = part2 ? asciiCharArray[part1] : (part1 ? asciiCharArray[part1 - 1] : 'æ')

asciiCtx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')'

asciiCtx.fillText(letter, _x * fontSize, (_y + 1) * fontSize)

}

}

}

...

...

搞腚!

核心的完成了下面就简单了,只要把资源换成视频,然后逐帧截取画面即可:

html结构如下:

...

...

您的浏览器不支持 HTML5 video 标签。

...

...

js代码如下:

var video = document.getElementById('video')

var offScreenCvs = document.createElement('canvas')

var offScreenCtx = offScreenCvs.getContext('2d', { alpha: false })

var asciiCvs = document.getElementById('ascii-canvas')

var asciiCtx = asciiCvs.getContext('2d', { alpha: false })

var offScreenCvsWidth, offScreenCvsHeight, asciiCvsWidth, asciiCvsHeight

var fontSize = 8

var samplerStep = 4

var maxWidth = 400, maxHeight = 400

video.onloadeddata = function () {

offScreenCvsWidth = video.videoWidth

offScreenCvsHeight = video.videoHeight

var ratio = offScreenCvsWidth / offScreenCvsHeight

if (video.videoWidth > maxWidth) {

offScreenCvsWidth = maxWidth

offScreenCvsHeight = Math.floor(offScreenCvsWidth / ratio)

}

if (video.videoHeight > maxHeight) {

offScreenCvsHeight = maxHeight

offScreenCvsWidth = Math.floor(offScreenCvsHeight * ratio)

}

offScreenCvs.width = offScreenCvsWidth

offScreenCvs.height = offScreenCvsHeight

asciiCvsWidth = (offScreenCvsWidth / samplerStep + 1) * fontSize

asciiCvsHeight = (offScreenCvsHeight / samplerStep + 1) * fontSize

asciiCvs.width = asciiCvsWidth

asciiCvs.height = asciiCvsHeight

offScreenCtx.drawImage(video, 0, 0, offScreenCvsWidth, offScreenCvsHeight)

imageData = offScreenCtx.getImageData(0, 0, offScreenCvsWidth, offScreenCvsHeight)

render()

video.onclick = function () {

video.paused ? video.play() : video.pause()

}

video.onplay = function () {

stop = false

rendering = false

requestAnimationFrame(tick)

}

video.onpause = function () {

stop = true

}

}

var imageData

var x, y, _x, _y, pos

var r, g, b

var asciiCharArray = '#KDGLftji+;,:.'.split('')

var durationPerChar = Math.ceil(255 / asciiCharArray.length)

function render () {

var imageDataContent = imageData.data

var part1, part2

var letter

var value

asciiCtx.fillStyle = '#ffffff'

asciiCtx.fillRect(0, 0, asciiCvsWidth, asciiCvsHeight)

asciiCtx.fillStyle = '#000000'

asciiCtx.font = fontSize + 'px SimHei'

for (y = 0, _y = 0; y < offScreenCvsHeight; y += samplerStep, _y++) {

for (x = 0, _x = 0; x < offScreenCvsWidth; x += samplerStep, _x++) {

pos = y * offScreenCvsWidth + x

r = imageDataContent[pos * 4]

g = imageDataContent[pos * 4 + 1]

b = imageDataContent[pos * 4 + 2]

value = r * 0.3086 + g * 0.6094 + b * 0.0820

imageDataContent[pos * 4] = imageDataContent[pos * 4 + 1] = imageDataContent[pos * 4 + 2] = value

part1 = Math.floor(value / durationPerChar)

part2 = value % durationPerChar

letter = part2 ? asciiCharArray[part1] : (part1 ? asciiCharArray[part1 - 1] : 'æ')

asciiCtx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')'

asciiCtx.fillText(letter, _x * fontSize, (_y + 1) * fontSize)

}

}

}

var stop = false // 是否停止

var timeNow = Date.now() // 当前时间戳

var timeLast = timeNow // 上一帧时间戳

var delta = 0 // 与上一帧间隔

var interval //

var fps = 60 // 帧率

interval = 1000 / fps // 每帧耗时

var rendering = false

var tick = function () {

if (stop) return false

timeNow = Date.now()

delta = timeNow - timeLast

if (delta > interval) {

timeLast = timeNow

if (!rendering) {

rendering = true

offScreenCtx.drawImage(video, 0, 0, offScreenCvsWidth, offScreenCvsHeight)

imageData = offScreenCtx.getImageData(0, 0, offScreenCvsWidth, offScreenCvsHeight)

render()

rendering = false

}

}

requestAnimationFrame(tick)

}

除了tick,别的基本没变化,解释一下这个,事实上,只要渲染视频并不用这么一长段,下面这样即可:

var tick = function () {

if (!rendering) {

rendering = true

offScreenCtx.drawImage(video, 0, 0, offScreenCvsWidth, offScreenCvsHeight)

imageData = offScreenCtx.getImageData(0, 0, offScreenCvsWidth, offScreenCvsHeight)

render()

rendering = false

}

requestAnimationFrame(tick)

}

多余的这些代码其实可以称为是一段 动画或游戏渲染的范式。因为的requestAnimationFrame渲染频率是根据浏览器的刷新率来的,而电脑实时的性能会影响屏幕的刷新率,但是通常我们的动画都是固定的帧率,为了保持最终渲染出来的帧率尽可能的符合设计,所以一般会根据设计的帧率来计算出每一帧的耗时,然后根据每一帧的实际耗时来算出理想状态下的变化量,以下就是比较常规的设计范式:

var stop = false // 是否停止渲染

var timeNow = Date.now() // 当前时间戳

var timeLast = timeNow // 上一帧时间戳

var delta = 0 // 与上一帧间隔

var fps = 60 // 帧率

var interval = 1000 / fps // 每帧耗时

var rendering = false // 是否渲染某组件

var tick = function () {

if (stop) return false

timeNow = Date.now()

delta = timeNow - timeLast

if (delta > interval) {

timeLast = timeNow

if (!rendering) {

// loop 代码

}

}

requestAnimationFrame(tick)

}

教程结束~~~~じゃない

那gif怎么搞呢?

845c43ac8afe00ca0eeb738b0c92ccb6.png

emmmm,gif-frames 可以把gif导出多张序列帧,后面的原理基本就和视频差不太多了,就给大家当课后作业吧 23333

61862b7c4cb5d7907354285413f5a897.pngDemo4:See the Pen ascii_art_pure by Kay (@oj8kay) on CodePen.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信更新对html影响,微信再次大更新 将极大影响用户使用习惯

[导读]微信再次迎来历史性大更新&#xff0c;小程序终于展露腾讯野心&#xff01;微信再次迎来历史性大更新&#xff0c;小程序终于展露腾讯野心!...微信小程序桌面在昨日1月22日晚&#xff0c;微信更新7.0.3版本&#xff0c;腾讯在App Store中只表示&#xff1a;本次是一次小更…

什么叫pmt测试分析_RVS — 面向目标硬件的软件性能测试工具

Rapita Verification Suite(简称&#xff1a;RVS)&#xff0c;为英国Rapita Systems公司提供的一款嵌入式系统在板测试套件。其产品符合ISO-26262、IEC-61508等行业标准&#xff0c;兼容Vxworks、Linux、SYSBIOS 等操作系统&#xff0c;支持C、C、Ada多种语言&#xff0c;多方位…

版本不见了_王者荣耀复古版本来袭?第四代主宰形象回归!可以给小兵加速

山河不足重&#xff0c;重在遇知已。好久不见&#xff0c;别来无恙来自小助理的文章推送~时值中秋&#xff0c;先祝大家中秋节快乐&#xff01;王者荣耀的新版本即将上线&#xff0c;不知道大家还记不记得新版本将会上线很多新的东西&#xff0c;峡谷路线更改&#xff0c;鼓励同…

python从小到大的顺序输出_「小白专栏」Python中使用for循环,为什么输出结果不是按顺序?...

欢迎各位小哥哥小姐姐阅读本的文章,对大家学习有帮助,请点赞加关注哦!!!!!!!!!!您的点赞和关注将是我持续更新的动力呢.^v^有不懂的问题可以私聊我哦!前言如图&#xff0c;为什么输出的不是按Jen, Sarah, Phil, Edward的顺序呢&#xff1f;大家可以先想想为什么&#xff1f;思考…

雷库兹韦尔量子计算机,熬到2045年,人类可能靠人工智能战胜死亡了

这几天差评君在网上冲浪的时候&#xff0c;无意间挖到了这一张坟图。虽然这已经是五六年前的老梗了&#xff0c;但依旧今人唏嘘不已&#xff0c;毕竟这些年来的技术发展真的是又快又粗暴。让人不由得想像公知们一样阴阳怪气一番&#xff1a;科技啊&#xff0c;请你慢些走&#…

elxel表格纸张尺寸_一本书的诞生:纸张知识

平张纸的数量以令来计算&#xff0c;不论纸张(百科)大小&#xff0c;每500张为一令。卷筒纸的数量通常以吨来计算&#xff0c;即用重量来反映数量。单张纸的重量以每平方米的克重来表示&#xff0c;单位是gsm&#xff0c;即g&#xff0f;m2&#xff0c;如果说80g的纸,就是每平方…

追加的英文计算机,Latex同时添加中英文摘要

注重版权&#xff0c;若要转载烦请附上作者和链接作者&#xff1a;Joshua_yi链接&#xff1a;https://blog.csdn.net/weixin_44984664/article/details/106168468哎&#xff0c;已经步入了开始写论文的年纪了&#xff0c;从之前的上传作业也慢慢变成了上交论文第一次用latex这玩…

React 路由

引言 在我们之前写的页面当中&#xff0c;用我们的惯用思维去思考的话&#xff0c;可能会需要写很多的页面&#xff0c;例如做一个 tab 栏&#xff0c;我们可能会想每个选项都要对应一个 HTML 文件&#xff0c;这样会很麻烦&#xff0c;甚至不友好&#xff0c;我们把这种称为 …

清华大学06届 计算机王煜,祝贺!这两位三年前从超银中学毕业的学霸,今年被清华大学“破格”录取啦...

青岛日报社/观海新闻8月13日讯 今年是“强基计划”首年招生&#xff0c;“强基计划”属于单独批次录取&#xff0c;也是高考所有批次录取中最早公布结果的&#xff0c;一经录取&#xff0c;就不再参加后续高考志愿录取投档。观海新闻记者从超银中学获悉&#xff0c;青岛二中今年…

jmeter web服务器协议,【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter测试SOAP协议性能测试脚本开发(示例代码)...

目录&#xff1a;【阐述】&#xff1a;首先应该遇到了一个共同的问题&#xff0c;JMeter3.2之后就没有WebService(SOAP) Request,后来经过查询网上资料得知其实可以用HTTP请求来操作&#xff0c;结果是一样的。【步骤】&#xff1a;一、创建WebService接口模拟服务端如果大家有…

flask bootstrap ajax,使用Flask集成bootstrap的方法

1. 下载flask-bootstrappip install flask-bootstrap2. 找到base.html文件将site-packages\flask_bootstrap\templates文件夹下的bootstrap目录copy到你的项目\templates目录下&#xff0c;确保bootstrap目录下包含base.html文件&#xff0c;因为我们后面要用到。3. 代码user.h…

chrome切换前端模式_H5暗黑模式在京东收银台中的实践

背景暗黑主题下&#xff0c;用户可以选择采用深色的系统范围外观而不是浅色外观。在暗黑模式下&#xff0c;系统对所有窗口&#xff0c;视图&#xff0c;菜单和控件采用较暗的调色板。谷歌的 Gmail 和 Chrome 浏览器、聊天工具 slack、telegram、Edge 浏览器和 Office 移动版 A…

使用udp协议实现服务器端程序时,用VisualC#实现UDP协议(二)

12.并以下面代码替换Form.cs中由系统产生的InitializeComponent过程。private void InitializeComponent ( ){this.button1 new System.Windows.Forms.Button ( ) ;this.button2 new System.Windows.Forms.Button ( ) ;this.textBox1 new System.Windows.Forms.TextBox ( ) …

魅族16无信号服务器,魅族16信号差的解决办法

手机信号问题一直都是人们关注的问题&#xff0c;在日常使用时有些地方手机可能出现突然信号变差&#xff0c;可能别人的手机信号一直很好只有你的出现了问题。魅族手机最早的几个版本都很容易出现这种问题&#xff0c;新款的魅族16怎么样呢&#xff1f;魅族16信号差怎么解决呢…

服务器系统核心和带gui区别,Windows Server 2012图形用户界面(GUI)和服务器核心(Server Core)之间的切换...

当安装 Windows Server 2012 时&#xff0c;咱们能够在“服务器核心安装”和“彻底安装”之间任选其一。“带 GUI 选项的服务器”选项Windows Server 2012 等效于 Windows Server 2008 R2 中的彻底安装选项。“服务器核心安装”选项可减小所需的磁盘空间、潜在的***面&#xff…

头条自己提问的问题在哪看_在头条的这三十天

文、图&#xff1a;书海履痕今天入头条三十天&#xff0c;按民间俗语&#xff0c;满月了。 三十个日子&#xff0c;真得是感慨万千。特别是昨日的文章&#xff0c;经头条君和各位友友们的厚爱&#xff0c;让我经历了过山车的感觉&#xff0c;各种滋味存于心底&#xff0c;在此谢…

c可以 char* 赋值但是c++不可以_雷佳音的妻子完全可以女团C位出道,这么有气质的女人,谁能不爱...

导读&#xff1a;雷佳音的妻子完全可以女团C位出道&#xff0c;这么有气质的女人&#xff0c;谁能不爱各位点开这篇文章的朋友们&#xff0c;想必都是很高的颜值吧&#xff0c;我们真的是很有缘哦&#xff0c;小编每天都会给大家带来不一样的汽车资讯&#xff0c;如果对小编的文…

oracle sequence 不同 会话 不连续_序列 Sequence

Sequence是一个数据库对象&#xff0c;多个用户可以从中生成唯一的整数&#xff0c;可以使用序列自动生成主键值。生成序列号时&#xff0c;序列号将递增&#xff0c;独立于事务提交或回滚;如果两个用户同时递增同一序列&#xff0c;因为序列号是由另一个用户生成的&#xff0c…

【加解密学习笔记:第二天】动态调试工具OllyDbg使用基础介绍

首先说一下OllyDbg的界面&#xff0c;如下图所示 下面依次介绍&#xff1a; 反汇编面板&#xff1a;有四列&#xff0c;从左到右依次为&#xff1a;地址&#xff08;Address&#xff09;&#xff0c;机器码&#xff08;Hex dump&#xff09;&#xff0c;反汇编代码&#xff08…

dmp只导数据不导结构_今日头条快消食品推广CVR为何高达4.40%?原来DMP定向这么好...

摘要&#xff1a;据艾媒报告显示&#xff0c;当前快消品消费在中国居民消费的比重已经占到34.6%&#xff0c;无疑是一支重要力量。虽然消费者的消费能力在不断提升&#xff0c;但快消行业的推广仍多受制于传统模式&#xff0c;应该怎么寻找出路呢&#xff1f;一、企业介绍客户L…