Rails + AMcharts (с php-скриптом для экспорта изображений) - PHP-скрипт конвертируется в контроллер? - PullRequest
0 голосов
/ 03 апреля 2010

Этот может быть немного запутанным. Я использую AMCharts с рельсами. Amcharts поставляется с PHP-скриптом для экспорта изображений под названием "export.php"

Я пытаюсь выяснить, как взять код в export.php и поместить его в контроллер.

Вот код:

   <?php
// amcharts.com export to image utility
// set image type (gif/png/jpeg)
$imgtype = 'jpeg';

// set image quality (from 0 to 100, not applicable to gif)
$imgquality = 100;

// get data from $_POST or $_GET ?
$data = &$_POST;

// get image dimensions
$width  = (int) $data['width'];
$height = (int) $data['height'];

// create image object
$img = imagecreatetruecolor($width, $height);

// populate image with pixels
for ($y = 0; $y < $height; $y++) {
  // innitialize
  $x = 0;

  // get row data
  $row = explode(',', $data['r'.$y]);

  // place row pixels
  $cnt = sizeof($row);
  for ($r = 0; $r < $cnt; $r++) {
    // get pixel(s) data
    $pixel = explode(':', $row[$r]);

    // get color
    $pixel[0] = str_pad($pixel[0], 6, '0', STR_PAD_LEFT);
    $cr = hexdec(substr($pixel[0], 0, 2));
    $cg = hexdec(substr($pixel[0], 2, 2));
    $cb = hexdec(substr($pixel[0], 4, 2));

    // allocate color
    $color = imagecolorallocate($img, $cr, $cg, $cb);

    // place repeating pixels
    $repeat = isset($pixel[1]) ? (int) $pixel[1] : 1;
    for ($c = 0; $c < $repeat; $c++) {
      // place pixel
      imagesetpixel($img, $x, $y, $color);

      // iterate column
      $x++;
    }
  }
}

// set proper content type
header('Content-type: image/'.$imgtype);
header('Content-Disposition: attachment; filename="chart.'.$imgtype.'"');

// stream image
$function = 'image'.$imgtype;
if ($imgtype == 'gif') {
  $function($img);
}
else {
  $function($img, null, $imgquality);
}

// destroy
imagedestroy($img);
?>

В найденной мной теме есть несколько версий: http://www.amcharts.com/forum/viewtopic.php?id=341

Но я чувствую, что с тех пор PHP-код изменился - потому что ни одна из реализаций не работала для меня.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2010

Так что, очевидно, я столкнулся с другими ошибками, из-за которых я думал, что уже существующий код не работает. Тем не менее, код в потоке, на который я ссылался в исходном вопросе, действительно работает!

0 голосов
/ 03 апреля 2010

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

Вы можете использовать метод Rmagick для рисования пикселя . Это даст вам тот же результат.

Поступающие почтовые данные выглядят так:

height = number -> cast to int
width = number -> cast to int
// first row with a repeating part of R:G:B,R:G:B,... (n = width)
r0 = 255:0:0,150:120:0,77:88:99,...
r1 = ...
.
.
r100 = ... -> the row count is the height - 1

На самом деле, я нашел обсуждение о ускорении пикселя за пиксельным рисунком.

...