Печать холста из обработки - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь сделать что-то вроде этого: http://instaprint.me/, однако у меня нет выделенной машины Linux, бумаги без чернил и WiFi. С другой стороны, у меня есть рабочий стол, подключенный к Интернету, и цветной фотопринтер.

Так что я имел в виду это -

  1. Установите приложение Instagram API, которое получает всю информацию о самой последней фотографии
  2. PHP-скрипт и сервер, который может создать статический URL для самой последней фотографии с header("Content-Type: image/jpeg"), так что каждый раз, когда я делаю новую фотографию, содержимое изображения на этой статической странице изменяется, чтобы быть наиболее недавнее фото.
  3. Другие страницы, подобные упомянутой выше, изменяются в соответствии с новым местоположением и заголовком каждой фотографии, которую я делаю, размещенной на статическом URL.
  4. Некоторые базовые знания по обработке.

Итак, вот как у меня получилось - я могу загрузить самое последнее удостоверение личности с фотографией, и если оно изменилось с момента последней проверки (15 секунд назад), то оно продолжает загружать самое последнее изображение, Подпись и местоположение.

Затем я могу расположить их на холсте так, чтобы они выглядели как старомодный поляроид. Теперь единственное, что мне нужно сделать, это напечатать холст с разрешением 150 точек на дюйм на фотобумаге 6x4 дюйма.

Кто-нибудь понял, как я мог это сделать?

1 Ответ

1 голос
/ 13 марта 2012

Сосредоточив внимание на выводе больших изображений в Processing, я выполнил поиск в Google и нашел эту тему .Процитируем их проблему и результаты:

Цель состоит в том, чтобы напечатать изображение в 180 pdi с формой, зависящей от исходного холста.Так что может быть разным, но в итоге получится картинка размером 1500x1000 мм.Итак, большое изображение.Я не пытаюсь отобразить его просто для того, чтобы выгрузить его в файл.

Затем я установил 64-битную JVM.Последний с сайта Oracle.Затем я создал другой размер изображения и увеличил объем памяти до 1024 МБ. 5000x7500 тест OK и 6000x9000 тест OK

Я попытался настроить память до 1500 МБ, но JVM не удалось запустить.Итак, я попробовал 1200MB 8000x12000 тест OK

Так что он не выполняет часть печати изображения, но выдает ключевую информацию о получении больших изображений в памяти через виртуальную машину Java( JVM ).


Наконец, этот поток описывает класс TileSaver для просмотра / печати большого количества пикселей с использованием OpenGL.Я вставил большой блок кода ниже.(Это может быть не связано с вашим вопросом, но делает ответ более полным для других целей.)

import processing.opengl.*;
import toxi.geom.*;
Tiler tiler;

void setup() {
  size(640,480,OPENGL);
  tiler=new Tiler((PGraphics3D)g,NUM_TILES);
}

void draw() {
  // see thread
}


/**
 * Implements a screen tile exporter with support for FOV,
 * clip planes and flexible file formats.
 * 
 * Re-engineered from an older version by Marius Watz:
 * http://workshop.evolutionzone.com/unlekkerlib/
 *
 * @author toxi <info at postspectacular dot com>
 */
class Tiler {
  protected PGraphics3D gfx;
  protected PImage buffer;
  protected Vec2D[] tileOffsets;
  protected double top;
  protected double bottom;
  protected double left;
  protected double right;
  protected Vec2D tileSize;

  protected int numTiles;
  protected int tileID;
  protected float subTileID;

  protected boolean isTiling;
  protected String fileName;
  protected String format;
  protected double cameraFOV;
  protected double cameraFar;
  protected double cameraNear;

  public Tiler(PGraphics3D g, int n) {
    gfx = g;
    numTiles = n;
  }

  public void chooseTile(int id) {
    Vec2D o = tileOffsets[id];
    gfx.frustum(o.x, o.x + tileSize.x, o.y, o.y + tileSize.y,
    (float) cameraNear, (float) cameraFar);
  }

  public void initTiles(float fov, float near, float far) {
    tileOffsets = new Vec2D[numTiles * numTiles];
    double aspect = (double) gfx.width / gfx.height;
    cameraFOV = fov;
    cameraNear = near;
    cameraFar = far;
    top = Math.tan(cameraFOV * 0.5) * cameraNear;
    bottom = -top;
    left = aspect * bottom;
    right = aspect * top;
    int idx = 0;
    tileSize = new Vec2D((float) (2 * right / numTiles), (float) (2 * top / numTiles));
    double y = top - tileSize.y;
    while (idx < tileOffsets.length) {
    double x = left;
    for (int xi = 0; xi < numTiles; xi++) {
      tileOffsets[idx++] = new Vec2D((float) x, (float) y);
      x += tileSize.x;
    }
    y -= tileSize.y;
    }
  }

  public void post() {
    if (isTiling) {
    subTileID += 0.5;
    if (subTileID > 1) {
      int x = tileID % numTiles;
      int y = tileID / numTiles;
      gfx.loadPixels();
      buffer.set(x * gfx.width, y * gfx.height, gfx);
      if (tileID == tileOffsets.length - 1) {
        buffer.save(fileName + "_" + buffer.width + "x"
        + buffer.height + "." + format);
        buffer = null;
      }
      subTileID = 0;
      isTiling = (++tileID < tileOffsets.length);
    }
    }
  }

  public void pre() {
    if (isTiling) {
    chooseTile(tileID);
    }
  }

  public void save(String path, String baseName, String format) {
    (new File(path)).mkdirs();
    this.fileName = path + "/" + baseName;
    this.format = format;
    buffer = new PImage(gfx.width * numTiles, gfx.height * numTiles);
    tileID = 0;
    subTileID = 0;
    isTiling = true;
  }

  public boolean isTiling() {
    return isTiling;
  }
} 
...