4

*.jpeg我的bookdown 项目(或 rmarkdown 网站,我认为这并不重要)中有一个相当大的(~ 14MB)。这是一个外部的静态图像,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 有多大,但很明显,网站上约 14MB 的图像非常糟糕。

knitr() rmarkdown() bookdown()有没有办法让工具链的某些元素自动将图像重新缩放到指定的适当分辨率?

我天真地假设如果同时 out.width指定和dpi,图像将在窗帘后面重新缩放(即:较小的文件大小),但事实并非如此,或者我使用错误

Ps.:我知道有可能指定 adpi然后knitr找出合适的尺寸;这不是我关心的问题。我想,有点,相反

4

2 回答 2

5

我认为调整实际图像大小(而不仅仅是它在 HTML 中的缩放方式)的唯一方法是将图像加载到 R 中并对其进行光栅化:

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

(光栅化方法改编自:How to set size for local image using knitr for markdown?

这将导致较小的图像/HTML 文件。

于 2016-08-20T11:45:08.677 回答
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
  }
}

还可以在knitrblogdown上查看这些相关问题。

于 2017-01-31T17:10:47.607 回答