aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Zotlabs/Daemon/Thumbnail.php62
-rw-r--r--Zotlabs/Storage/Browser.php13
-rw-r--r--Zotlabs/Storage/Directory.php2
-rw-r--r--Zotlabs/Storage/File.php3
-rw-r--r--include/attach.php3
-rw-r--r--include/photo/photo_driver.php109
-rw-r--r--include/photos.php8
7 files changed, 150 insertions, 50 deletions
diff --git a/Zotlabs/Daemon/Thumbnail.php b/Zotlabs/Daemon/Thumbnail.php
new file mode 100644
index 000000000..aeea07410
--- /dev/null
+++ b/Zotlabs/Daemon/Thumbnail.php
@@ -0,0 +1,62 @@
+<?php /** @file */
+
+namespace Zotlabs\Daemon;
+
+
+class Thumbnail {
+
+ static public function run($argc,$argv) {
+
+ if(! $argc == 2)
+ return;
+
+ $c = q("select * from attach where hash = '%s' ",
+ dbesc($argv[1])
+ );
+
+ if(! $c)
+ return;
+
+ $preview_style = intval(get_config('system','thumbnail_security',0));
+
+ $attach = $c[0];
+ $isize = 300;
+
+ if(strpos($attach['filetype'],'text/') !== false) {
+ $stream = @fopen($attach['content'],'rb');
+ if($stream) {
+ $content = trim(stream_get_contents($stream,4096));
+ $content = str_replace("\r",'',$content);
+ $content_a = explode("\n",$content);
+ }
+ if($content_a) {
+ $fsize = 4;
+ $lsize = 8;
+ $image = imagecreate($isize,$isize);
+ imagecolorallocate($image,255,255,255);
+ $colour = imagecolorallocate($image,0,0,0);
+ $border = imagecolorallocate($image,64,64,64);
+
+ $x1 = 0;
+ $y1 = 0;
+ $x2 = ImageSX($image) - 1;
+ $y2 = ImageSY($image) - 1;
+
+ for($i = 0; $i < 2; $i++) {
+ ImageRectangle($image, $x1++, $y1++, $x2--, $y2--, $border);
+ }
+
+ foreach($content_a as $l => $t) {
+ $l = $l + 1;
+ $x = 3;
+ $y = ($l * $lsize) + 3 - $fsize;
+ imagestring($image,1,$x,$y,$t,$colour);
+ if(($l * $lsize) >= $isize) {
+ break;
+ }
+ }
+ imagejpeg($image,$attach['content'] . '.thumb');
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php
index 17b07ad82..dd3067cf8 100644
--- a/Zotlabs/Storage/Browser.php
+++ b/Zotlabs/Storage/Browser.php
@@ -208,6 +208,16 @@ class Browser extends DAV\Browser\Plugin {
$photo_icon = '';
$preview_style = intval(get_config('system','thumbnail_security',0));
+ $r = q("select content from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($attachHash),
+ intval($owner)
+ );
+
+ if($r && file_exists(dbunescbin($r[0]['content']) . '.thumb')) {
+ $photo_icon = 'data:image/jpeg;base64,' . base64_encode(file_get_contents(dbunescbin($r[0]['content']) . '.thumb'));
+// logger('found thumb: ' . $photo_icon);
+ }
+
if(strpos($type,'image/') === 0 && $attachHash) {
$r = q("select resource_id, imgscale from photo where resource_id = '%s' and imgscale in ( %d, %d ) order by imgscale asc limit 1",
dbesc($attachHash),
@@ -220,12 +230,11 @@ class Browser extends DAV\Browser\Plugin {
if($type === 'image/svg+xml' && $preview_style > 0) {
$photo_icon = $fullPath;
}
-
}
$g = [ 'resource_id' => $attachHash, 'thumbnail' => $photo_icon, 'security' => $preview_style ];
call_hooks('file_thumbnail', $g);
- $photo_icon = $g['photo_icon'];
+ $photo_icon = $g['thumbnail'];
$attachIcon = ""; // "<a href=\"attach/".$attachHash."\" title=\"".$displayName."\"><i class=\"fa fa-arrow-circle-o-down\"></i></a>";
diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php
index 27df3569f..45df9ddd5 100644
--- a/Zotlabs/Storage/Directory.php
+++ b/Zotlabs/Storage/Directory.php
@@ -362,6 +362,8 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
$args = array( 'resource_id' => $hash, 'album' => $album, 'os_syspath' => $f, 'os_path' => $xpath['os_path'], 'display_path' => $xpath['path'], 'filename' => $name, 'getimagesize' => $gis, 'directory' => $direct);
$p = photo_upload($c[0], \App::get_observer(), $args);
}
+
+ \Zotlabs\Daemon\Master::Summon([ 'Thumbnail' , $this->folder_hash ]);
$sync = attach_export_data($c[0], $hash);
diff --git a/Zotlabs/Storage/File.php b/Zotlabs/Storage/File.php
index 8bf9997ed..37376c177 100644
--- a/Zotlabs/Storage/File.php
+++ b/Zotlabs/Storage/File.php
@@ -244,6 +244,9 @@ class File extends DAV\Node implements DAV\IFile {
}
}
+ \Zotlabs\Daemon\Master::Summon([ 'Thumbnail' , $this->data['hash'] ]);
+
+
$sync = attach_export_data($c[0],$this->data['hash']);
if($sync)
diff --git a/include/attach.php b/include/attach.php
index 0f07fe035..0f31ed012 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -951,6 +951,9 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
call_hooks('photo_upload_end', $ret);
}
+ \Zotlabs\Daemon\Master::Summon([ 'Thumbnail' , $hash ]);
+
+
if($dosync) {
$sync = attach_export_data($channel,$hash);
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
index 21431e96f..f75ff2386 100644
--- a/include/photo/photo_driver.php
+++ b/include/photo/photo_driver.php
@@ -241,69 +241,84 @@ abstract class photo_driver {
}
+ /**
+ * @brief reads exif data from filename
+ */
+ public function exif($filename) {
- public function orient($filename) {
- /**
- * This function is a bit unusual, because it is operating on a file, but you must
- * first create an image from that file to initialise the type and check validity
- * of the image.
- */
-
- if(! $this->is_valid())
+ if((! function_exists('exif_read_data'))
+ || (! in_array($this->getType(), [ 'image/jpeg' , 'image/tiff'] ))) {
return false;
+ }
- if((! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg'))
- return false;
-
- $exif = @exif_read_data($filename,null,true);
-
- if($exif) {
- $ort = $exif['IFD0']['Orientation'];
-
- switch($ort)
- {
- case 1: // nothing
- break;
+ /*
+ * PHP 7.2 allows you to use a stream resource, which should reduce/avoid
+ * memory exhaustion on large images.
+ */
- case 2: // horizontal flip
- $this->flip();
- break;
+ if(version_compare(PHP_VERSION,'7.2.0') >= 0) {
+ $f = @fopen($filename,'rb');
+ }
+ else {
+ $f = $filename;
+ }
- case 3: // 180 rotate left
- $this->rotate(180);
- break;
+ if($f) {
+ return @exif_read_data($f);
+ }
- case 4: // vertical flip
- $this->flip(false, true);
- break;
+ return false;
+ }
- case 5: // vertical flip + 90 rotate right
- $this->flip(false, true);
- $this->rotate(-90);
- break;
+ /**
+ * @brief orients current image based on exif orientation information
+ */
- case 6: // 90 rotate right
- $this->rotate(-90);
- break;
+ public function orient($exif) {
- case 7: // horizontal flip + 90 rotate right
- $this->flip();
- $this->rotate(-90);
- break;
+ if(! ($this->is_valid() && $exif)) {
+ return false;
+ }
- case 8: // 90 rotate left
- $this->rotate(90);
- break;
- }
+ $ort = $exif['IFD0']['Orientation'];
- return $exif;
+ if(! $ort) {
+ return false;
+ }
+ switch($ort) {
+ case 1: // nothing
+ break;
+ case 2: // horizontal flip
+ $this->flip();
+ break;
+ case 3: // 180 rotate left
+ $this->rotate(180);
+ break;
+ case 4: // vertical flip
+ $this->flip(false, true);
+ break;
+ case 5: // vertical flip + 90 rotate right
+ $this->flip(false, true);
+ $this->rotate(-90);
+ break;
+ case 6: // 90 rotate right
+ $this->rotate(-90);
+ break;
+ case 7: // horizontal flip + 90 rotate right
+ $this->flip();
+ $this->rotate(-90);
+ break;
+ case 8: // 90 rotate left
+ $this->rotate(90);
+ break;
+ default:
+ break;
}
-
- return false;
+ return true;
}
diff --git a/include/photos.php b/include/photos.php
index 41a1d18cb..b1391f284 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -203,7 +203,13 @@ function photo_upload($channel, $observer, $args) {
return $ret;
}
- $exif = $ph->orient(($args['os_syspath']) ? $args['os_syspath'] : $src);
+ // obtain exif data from the source file if present
+
+ $exif = $ph->exif(($args['os_syspath']) ? $args['os_syspath'] : $src);
+
+ if($exif) {
+ $ph->orient($exif);
+ }
@unlink($src);