port of reds geotag feature

This commit is contained in:
rabuzarus 2015-09-30 12:33:57 +02:00
parent 2e8caf7f27
commit 8e1564965d
4 changed files with 96 additions and 31 deletions

View File

@ -345,38 +345,37 @@ class Photo {
} }
public function orient($filename) { public function orient($filename) {
if ($this->is_imagick()) { if ($this->is_imagick()) {
// based off comment on http://php.net/manual/en/imagick.getimageorientation.php // based off comment on http://php.net/manual/en/imagick.getimageorientation.php
$orientation = $this->image->getImageOrientation(); $orientation = $this->image->getImageOrientation();
switch ($orientation) { switch ($orientation) {
case imagick::ORIENTATION_BOTTOMRIGHT: case imagick::ORIENTATION_BOTTOMRIGHT:
$this->image->rotateimage("#000", 180); $this->image->rotateimage("#000", 180);
break; break;
case imagick::ORIENTATION_RIGHTTOP: case imagick::ORIENTATION_RIGHTTOP:
$this->image->rotateimage("#000", 90); $this->image->rotateimage("#000", 90);
break; break;
case imagick::ORIENTATION_LEFTBOTTOM: case imagick::ORIENTATION_LEFTBOTTOM:
$this->image->rotateimage("#000", -90); $this->image->rotateimage("#000", -90);
break; break;
} }
$this->image->setImageOrientation(imagick::ORIENTATION_TOPLEFT); $this->image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
return TRUE; return TRUE;
} }
// based off comment on http://php.net/manual/en/function.imagerotate.php // based off comment on http://php.net/manual/en/function.imagerotate.php
if(!$this->is_valid()) if(!$this->is_valid())
return FALSE; return FALSE;
if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') ) if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
return; return;
$exif = @exif_read_data($filename); $exif = @exif_read_data($filename,null,true);
if(! $exif)
return;
if(! $exif) $ort = $exif['IFD0']['Orientation'];
return;
$ort = $exif['Orientation'];
switch($ort) switch($ort)
{ {
@ -413,6 +412,10 @@ class Photo {
$this->rotate(90); $this->rotate(90);
break; break;
} }
// logger('exif: ' . print_r($exif,true));
return $exif;
} }

View File

@ -23,6 +23,7 @@ function get_features() {
t('General Features'), t('General Features'),
//array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')), //array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')), array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')),
array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'),false),
), ),
// Post composition // Post composition

27
include/photos.php Normal file
View File

@ -0,0 +1,27 @@
<?php
/**
* @file include/photos.php
* @brief Functions related to photo handling.
*/
function getGps($exifCoord, $hemi) {
$degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
$minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
$seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;
$flip = ($hemi == 'W' or $hemi == 'S') ? -1 : 1;
return floatval($flip * ($degrees + ($minutes / 60) + ($seconds / 3600)));
}
function gps2Num($coordPart) {
$parts = explode('/', $coordPart);
if (count($parts) <= 0)
return 0;
if (count($parts) == 1)
return $parts[0];
return floatval($parts[0]) / floatval($parts[1]);
}

View File

@ -1,5 +1,6 @@
<?php <?php
require_once('include/Photo.php'); require_once('include/Photo.php');
require_once('include/photos.php');
require_once('include/items.php'); require_once('include/items.php');
require_once('include/acl_selectors.php'); require_once('include/acl_selectors.php');
require_once('include/bbcode.php'); require_once('include/bbcode.php');
@ -198,6 +199,10 @@ function photos_post(&$a) {
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']); goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
} }
/*
* RENAME photo album
*/
$newalbum = notags(trim($_POST['albumname'])); $newalbum = notags(trim($_POST['albumname']));
if($newalbum != $album) { if($newalbum != $album) {
q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d", q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
@ -210,6 +215,9 @@ function photos_post(&$a) {
return; // NOTREACHED return; // NOTREACHED
} }
/*
* DELETE photo album and all its photos
*/
if($_POST['dropalbum'] == t('Delete Album')) { if($_POST['dropalbum'] == t('Delete Album')) {
@ -837,7 +845,7 @@ function photos_post(&$a) {
killme(); killme();
} }
$ph->orient($src); $exif = $ph->orient($src);
@unlink($src); @unlink($src);
$max_length = get_config('system','max_image_length'); $max_length = get_config('system','max_image_length');
@ -878,8 +886,20 @@ function photos_post(&$a) {
// Create item container // Create item container
$lat = $lon = null;
if($exif && $exif['GPS']) {
if(feature_enabled($channel_id,'photo_location')) {
$lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']);
$lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']);
}
}
$arr = array(); $arr = array();
if($lat && $lon)
$arr['coord'] = $lat . ' ' . $lon;
$arr['uid'] = $page_owner_uid; $arr['uid'] = $page_owner_uid;
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['parent-uri'] = $uri; $arr['parent-uri'] = $uri;
@ -1066,10 +1086,9 @@ function photos_content(&$a) {
$is_owner = (local_user() && (local_user() == $owner_uid)); $is_owner = (local_user() && (local_user() == $owner_uid));
$o .= profile_tabs($a,$is_owner, $a->data['user']['nickname']); $o .= profile_tabs($a,$is_owner, $a->data['user']['nickname']);
// /**
// dispatch request * Display upload form
// */
if($datatype === 'upload') { if($datatype === 'upload') {
if(! ($can_post)) { if(! ($can_post)) {
@ -1180,6 +1199,10 @@ function photos_content(&$a) {
return $o; return $o;
} }
/*
* Display a single photo album
*/
if($datatype === 'album') { if($datatype === 'album') {
$album = hex2bin($datum); $album = hex2bin($datum);
@ -1207,6 +1230,7 @@ function photos_content(&$a) {
intval($a->pager['itemspage']) intval($a->pager['itemspage'])
); );
//edit album name
if($cmd === 'edit') { if($cmd === 'edit') {
if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) { if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
if($can_post) { if($can_post) {
@ -1294,11 +1318,12 @@ function photos_content(&$a) {
} }
/**
* Display one photo
*/
if($datatype === 'image') { if($datatype === 'image') {
//$o = ''; //$o = '';
// fetch image, item containing image, then comments // fetch image, item containing image, then comments
@ -1422,6 +1447,9 @@ function photos_content(&$a) {
$linked_items = q("SELECT * FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1", $linked_items = q("SELECT * FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1",
dbesc($datum) dbesc($datum)
); );
$map = null;
if(count($linked_items)) { if(count($linked_items)) {
$link_item = $linked_items[0]; $link_item = $linked_items[0];
$r = q("SELECT COUNT(*) AS `total` $r = q("SELECT COUNT(*) AS `total`
@ -1465,6 +1493,10 @@ function photos_content(&$a) {
); );
update_thread($link_item['parent']); update_thread($link_item['parent']);
} }
if($link_item['coord']) {
$map = generate_map($link_item['coord']);
}
} }
$tags=Null; $tags=Null;
@ -1757,6 +1789,8 @@ function photos_content(&$a) {
'$desc' => $ph[0]['desc'], '$desc' => $ph[0]['desc'],
'$tags' => $tags_e, '$tags' => $tags_e,
'$edit' => $edit, '$edit' => $edit,
'$map' => $map,
'$map_text' => t('Map'),
'$likebuttons' => $likebuttons, '$likebuttons' => $likebuttons,
'$like' => $like_e, '$like' => $like_e,
'$dislike' => $dikslike_e, '$dislike' => $dikslike_e,