Как изменить масштаб локальных изображений для сайта bookdown / rmarkdown?

r jpeg knitr r-markdown bookdown

462 просмотра

2 ответа

У меня довольно большой (~ 14MB) *.jpegв моем проекте по уценке (или на сайте rmarkdown, я думаю, что это не имеет значения). Это внешнее статичное изображение, не затронутое R (пока).

Я называю картинку вот так:

```{r q-pic, echo=FALSE, out.width="100%", fig.cap="Q-Sorting during the 2016 CiviCon", dpi = 72}
include_graphics(path = "img/q-sorting3.jpg")
```

Я также установил сетчатку через opts_knit$set(fig.retina = 2).

Мне действительно все равно, насколько велик PDF, но, очевидно, изображение размером ~ 14 МБ на сайте довольно плохое.

Есть ли способ, которым какой-то элемент knitr() rmarkdown() bookdown()цепочки инструментов может автоматически масштабировать изображения до указанного, соответствующего разрешения?

Я наивно предполагал, что если бы и то, out.width и другоеdpi было указано, что изображение будет изменено (то есть: файл меньшего размера) за занавесками, но это либо не соответствует действительности, либо я использую его неправильно .

Пс .: я понимаю, что есть возможность уточнить, dpiа потом knitrпридумать подходящий размер; это не моя забота. Я хотел бы, как бы наоборот .

Автор: maxheld Источник Размещён: 08.11.2019 11:13

Ответы (2)


4 плюса

Решение

Я думаю, что единственный способ отрегулировать фактический размер изображения (а не только то, как он масштабируется в HTML) - это загрузить изображение в R и растеризовать его:

```{r fig.width=3}
library(jpeg)
library(grid)
img <- readJPEG("test.jpg")
grid.raster(img)
```

(Подход растеризации адаптирован из: Как установить размер для локального изображения, используя knitr для уценки? )

Это приведет к уменьшению файла изображения / HTML.

Автор: Keith Hughitt Размещён: 20.08.2016 11:45

0 плюса

Теперь я также реализовал функцию сжатия и перемасштабирования в обычном R. Это не быстро, но может быть неуклюжим, но оно выполнит свою работу.

library(jpeg)
library(imager)

resize_n_compress <- function(file_in, file_out, xmax = 1920, quality = 0.7, cutoff = 100000) {
  # xmax <- 1920  # y pixel max
  # quality <- 0.7  # passed on to jpeg::writeJPEG()
  # cutoff <- 100000  # files smaller than this will not be touched
  # file_out <- "test.jpg"
  if (file.size(file_in) < cutoff) {  # in this case, just copy file
    if (!(file_in == file_out)) {
      file.copy(from = file_in, to = file_out, overwrite = TRUE)
    }
  } else {# if larger than cutoff
    image_raw <- imager::load.image(file = file_in)
    if (dim(image_raw)[1] > xmax) {  # resize only when larger
      x_pix <- xmax  # just in case we want to calculate this, too at some point
      x_factor <- xmax/dim(image_raw)[1]
      y_pix <- round(dim(image_raw)[2] * x_factor)
      image_resized <- imager::resize(im = image_raw, size_x = x_pix, size_y = y_pix)
    } else {# otherwise take raw
      image_resized <- image_raw
    }
    saveme <- imager:::convert.im.toPNG(A = image_resized)
    jpeg::writeJPEG(image = saveme, target = file_out, quality = quality)  # this overwrites by default
  }
}

Также см. Эти связанные проблемы на knitr и blogdown .

Автор: maxheld Размещён: 31.01.2017 05:10
Вопросы из категории :
32x32