Ниже 3 различных вариантов, чтобы помочь вам уменьшить размер файла файлов HTML с кодированными изображениями.
1. Оптимизировать существующий HTML файл
Вы можете запустить this Python script на существующий HTML-файл. Сценарий:
- Декодирование base64 кодированные изображения
- запустить pngquant, чтобы оптимизировать изображения
- перекодировать оптимизированные изображения как base64
Использование:
python optimize_html.py infile.html
Он записывает вывод в infile-optimized.html
.
2. Используйте встроенный knitr крюк для оптимизации PNG изображения
knitr 1,15 включает в себя крючок под названием hook_optipng
, который будет запускать программу optipng на сгенерированных файлов PNG, чтобы уменьшить размер файла.
Вот .Rmd
пример (взято из: knitr-examples/035-optipng.Rmd):
# 035-optipng.Rmd
This demo shows you how to optimize PNG images with `optipng`.
```{r setup}
library(knitr)
knit_hooks$set(optipng = hook_optipng)
```
Now we set the chunk option `optipng` to a non-`NULL` value,
e.g. `optipng=''`, to activate the hook. This string is passed to
`optipng`, so you can use `optipng='-o7'` to optimize more heavily.
```{r use-optipng, optipng=''}
library(methods)
library(ggplot2)
set.seed(123)
qplot(rnorm(1e3), rnorm(1e3))
```
3. Напишите свой knitr крюк для любого изображения оптимизатора
Writing your own hook тоже довольно легко, поэтому я написал крюк, который вызывает программу pngquant.Я нахожу, что pngquant
работает быстрее, а выходные файлы меньше и выглядят лучше.
Вот пример .R
, который определяет и использует hook_pngquant
(взято из this gist).
#' ---
#' title: "pngquant demo"
#' author: "Kamil Slowikowski"
#' date: "`r Sys.Date()`"
#' output:
#' html_document:
#' self_contained: true
#' ---
#+ setup, include=FALSE
library(knitr)
# Functions taken from knitr/R/utils.R
all_figs = function(options, ext = options$fig.ext, num = options$fig.num) {
fig_path(ext, options, number = seq_len(num))
}
in_dir = function(dir, expr) {
if (!is.null(dir)) {
owd = setwd(dir); on.exit(setwd(owd))
}
wd1 = getwd()
res = expr
wd2 = getwd()
if (wd1 != wd2) warning(
'You changed the working directory to ', wd2, ' (probably via setwd()). ',
'It will be restored to ', wd1, '. See the Note section in ?knitr::knit'
)
res
}
is_windows = function() .Platform$OS.type == 'windows'
in_base_dir = function(expr) {
d = opts_knit$get('base.dir')
if (is.character(d) && !file_test('-d', d)) dir.create(d, recursive = TRUE)
in_dir(d, expr)
}
# Here is the code you can modify to use any image optimizer.
hook_pngquant <- function(before, options, envir) {
if (before)
return()
ext = tolower(options$fig.ext)
if (ext != "png") {
warning("this hook only works with PNG")
return()
}
if (!nzchar(Sys.which("pngquant"))) {
warning("cannot find pngquant; please install and put it in PATH")
return()
}
paths = all_figs(options, ext)
in_base_dir(lapply(paths, function(x) {
message("optimizing ", x)
cmd = paste(
"pngquant",
if (is.character(options$pngquant)) options$pngquant,
shQuote(x)
)
message(cmd)
(if (is_windows())
shell
else system)(cmd)
x_opt = sub("\\.png$", "-fs8.png", x)
file.rename(x_opt, x)
}))
return()
}
# Enable this hook in this R script.
knit_hooks$set(
pngquant = hook_pngquant
)
#' Here we set the chunk option `pngquant='--speed=1 --quality=0-50'`,
#' which activates the hook.
#+ use-pngquant, pngquant='--speed=1 --quality=0-50'
library(methods)
library(ggplot2)
set.seed(123)
qplot(rnorm(1e3), rnorm(1e3))
Я предпочитаю писать свои отчеты в сценариях R (.R
) вместо уценки документов R (.Rmd
). См. http://yihui.name/knitr/demo/stitch/ для получения дополнительной информации о том, как это сделать.
Есть ли способ встраивать изображения, но не все остальное (как и все точки данных и т. Д.)? Не уверен, что они могут быть разделены действительно, но это было бы идеально. Спасибо за точку в этом направлении. – moman822
Что вы имеете в виду, когда говорите о точках данных? Когда вы создаете документ knitr/RMarkdown, единственное, что входит в HTML, - это текст/код в документе и все, что напечатано или построено. Таким образом, если вы явно не печатаете рамку данных на экране, сами точки данных будут отображаться косвенно только на ваших графиках. Если вы используете SVG или что-то подобное, изображения будут большими, поскольку они сохраняют каждый datapoint, но если вы используете только значения по умолчанию (PNG), это не должно быть проблемой. –
Я думал, что содержимое каждого кадра данных каким-то образом хранится в вязаном html, например, html-код - это весь процесс выполнения вычислений и т. Д. Я думал только об этом, потому что html-файл значительно больше, чем документ вязаного слова. Ясно, что я не очень хорошо знаком с этими внутренними разработками или с html, поэтому спасибо за вашу помощь. – moman822