Заполните пустое пространство при построении нескольких растровых изображений - PullRequest
0 голосов
/ 25 ноября 2018

Как минимизировать количество пробелов на следующем изображении, сохраняя соотношение сторон изображения?

enter image description here

Я указал mar=c(0,0,1,0) поляно изображения все еще разнесены.Есть дополнительное расстояние слева, в центре, снизу и справа.Я хочу, чтобы изображения сортировались в сетке с очень небольшим интервалом между ними.

Вот что у меня получилось:

library(EBImage)
library(png)

pngs<-lapply(seq(1:4), function(x) {
   readPNG(system.file("images", "sample-color.png", package="EBImage"))
})

par(mfrow=c(2,2), mar=c(0, 0, 1, 0))
invisible(sapply(seq_along(pngs), function(i) {
  plot.new()
  plot.window(xlim=c(0, 1), ylim=c(0, 1), asp=1)
  rasterImage(pngs[[i]], 0, 0, 1, 1)
  title(paste0(letters[i], '. Image ', i), font.main=2)
}))

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Если другие функции пакета png не являются необходимыми, вот еще одно решение, которое использует EBImage.EBImage поддерживает соотношение сторон, если изображение не было намеренно преобразовано.

Это решение требует больше работы для размещения меток на графике с text(), но увеличение стоимости может быть компенсировано большей гибкостью.

# Starting from EBImage
  library(EBImage)
  fn <- system.file("images", "sample-color.png", package="EBImage")

# Single EBImage object with same four pictures
  pngs <- readImage(rep(fn, 4))

# Select spacing and margin for EBImage display/plot function
  spacing <- 50 # pixels between images
  margin <- 50 # pixels around edge
  nx <- 2 # number of rows for composite
  ny <- 2 # number of columns for composite
  dm <- dim(pngs)
  nframes <- dm[length(dm)]
  yadj <- -0.2 # offset for labels in y direction

# Indices, coordinates, and labels for text
  index <- seq_len(nframes)
  ix <- (index - 1)%%nx
  iy <- (index - 1)%/%nx
  xx <- ix*(dm[1] + spacing) + dm[1]/2
  yy <- iy*(dm[2] + spacing)
  labs <- sprintf("%s. Image %d", letters[index], index)

# Plot composite and add "titles" with text() function
  plot(pngs, all = TRUE, nx = nx, margin = margin, spacing = spacing)
  text(xx, yy, labs, adj = c(0.5, yadj))

# To eliminate ANY space in the composite make the following
# changes and re-run the code from "# Indices, coordinates..."
  spacing <- 0
  margin <- 0
  yadj <- 1.2
  dev.new(width = nx*dm[1]/200, height = ny*dm[2]/200) # 200 dpi image
0 голосов
/ 25 ноября 2018

Из-за asp=1 изображения сохраняют исходный формат 512:768 в вашем примере.И наоборот, ваше устройство печати по умолчанию имеет соотношение сторон, близкое к 1:1.Это не очень хорошо подходит и приводит к появлению пробелов.

Два решения:

  1. Установите asp=NA, чтобы изображения могли использовать все пространство устройства.искажая их.
  2. Настройте размер устройства печати, задав аргументы width и height для dev.new().Например:

    library(EBImage)
    library(png)
    png <- readPNG(system.file("images", "sample-color.png", package="EBImage"))
    dev.new(width=4.5, height=8)
    par(mfrow=c(2,2), mar=c(0, 0, 1, 0))
    for(i in seq_len(4)){
        plot.new()
        plot.window(xlim=c(0, 1), ylim=c(0, 1), asp=1)
        rasterImage(png, 0, 0, 1, 1)
        title(paste0("Image ", i))
    }
    
...