Skip to content
Snippets Groups Projects
Commit 5b44714f authored by Frank Karlitschek's avatar Frank Karlitschek
Browse files

first version of the new previewer lib. It currently only created...

first version of the new previewer lib. It currently only created previews/thumbnails for images. It get´s more interesting when we add PDFs, movies, mp3, text files and more...
parent 89f2d4ba
Branches
No related tags found
No related merge requests found
<?php
/**
* Copyright (c) 2012 Frank Karlitschek frank@owncloud.org
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
/*
TODO:
- delete thumbnails if files change.
- movies support
- pdf support
- mp3/id3 support
- more file types
*/
class OC_Preview {
/**
* @brief return a preview of a file
* @param $file The path to the file where you want a thumbnail from
* @param $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
* @param $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
* @return image
*/
static public function show($file,$maxX,$maxY) {
$mimetype=explode('/',OC_FileSystem::getMimeType($file));
if($mimetype[0]=='imaage'){
OCP\Response::enableCaching(3600 * 24); // 24 hour
$image=OC_PreviewImage::getThumbnail($file,$maxX,$maxY,false);
$image->show();
}else{
header('Content-type: image/png');
OC_PreviewUnknown::getThumbnail($maxX,$maxY);
}
}
}
class OC_PreviewImage {
// the thumbnail cache folder
const THUMBNAILS_FOLDER = 'thumbnails';
public static function getThumbnail($path,$maxX,$maxY,$scalingup) {
$thumbnails_view = new \OC_FilesystemView('/'.\OCP\User::getUser() .'/'.self::THUMBNAILS_FOLDER);
// is a preview already in the cache?
if ($thumbnails_view->file_exists($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup)) {
return new \OC_Image($thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup));
}
// does the sourcefile exist?
if (!\OC_Filesystem::file_exists($path)) {
\OC_Log::write('Preview', 'File '.$path.' don\'t exists', \OC_Log::WARN);
return false;
}
// open the source image
$image = new \OC_Image();
$image->loadFromFile(\OC_Filesystem::getLocalFile($path));
if (!$image->valid()) return false;
// fix the orientation
$image->fixOrientation();
// calculate the right preview size
$Xsize=$image->width();
$Ysize=$image->height();
if (($Xsize/$Ysize)>($maxX/$maxY)) {
$factor=$maxX/$Xsize;
} else {
$factor=$maxY/$Ysize;
}
// only scale up if requested
if($scalingup==false) {
if($factor>1) $factor=1;
}
$newXsize=$Xsize*$factor;
$newYsize=$Ysize*$factor;
// resize
$ret = $image->preciseResize($newXsize, $newYsize);
if (!$ret) {
\OC_Log::write('Preview', 'Couldn\'t resize image', \OC_Log::ERROR);
unset($image);
return false;
}
// store in cache
$l = $thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup);
$image->save($l);
return $image;
}
}
class OC_PreviewUnknown {
public static function getThumbnail($maxX,$maxY) {
// check if GD is installed
if(!extension_loaded('gd') || !function_exists('gd_info')) {
OC_Log::write('preview', __METHOD__.'(): GD module not installed', OC_Log::ERROR);
return false;
}
// create a white image
$image = imagecreatetruecolor($maxX, $maxY);
$color = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $color);
// output the image
imagepng($image);
imagedestroy($image);
}
}
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @copyright 2012 Frank Karlitschek frank@owncloud.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
/**
* Public interface of ownCloud for apps to use.
* Preview Class.
*
*/
// use OCP namespace for all classes that are considered public.
// This means that they should be used by apps instead of the internal ownCloud classes
namespace OCP;
/**
* This class provides functions to render and show thumbnails and previews of files
*/
class Preview {
/**
* @brief return a preview of a file
* @param $file The path to the file where you want a thumbnail from
* @param $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
* @param $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
* @param $scaleup Scale smaller images up to the thumbnail size or not. Might look ugly
* @return image
*/
public static function show($file,$maxX=100,$maxY=75,$scaleup=false) {
return(\OC_Preview::show($file,$maxX,$maxY,$scaleup));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment