- Add "-a" argument to filter show pictures by aspect ratio (potrait, landscape or all)
This commit is contained in:
@@ -5,21 +5,86 @@
|
||||
#include <QTimer>
|
||||
#include <QApplication>
|
||||
#include <QDir>
|
||||
#include <libexif/exif-data.h>
|
||||
#include <iostream>
|
||||
#include <stdlib.h> /* srand, rand */
|
||||
#include <time.h> /* time */
|
||||
#include <algorithm> // std::shuffle
|
||||
#include <random> // std::default_random_engine
|
||||
|
||||
ImageSelector::ImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
|
||||
pathTraverser(pathTraverser)
|
||||
ImageSelector::ImageSelector(std::unique_ptr<PathTraverser>& pathTraverser, char aspect):
|
||||
pathTraverser(pathTraverser), _aspect(aspect)
|
||||
{
|
||||
}
|
||||
|
||||
ImageSelector::~ImageSelector(){}
|
||||
|
||||
RandomImageSelector::RandomImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
|
||||
ImageSelector(pathTraverser)
|
||||
int ImageSelector::getImageRotation(const std::string &fileName)
|
||||
{
|
||||
int orientation = 0;
|
||||
ExifData *exifData = exif_data_new_from_file(fileName.c_str());
|
||||
if (exifData)
|
||||
{
|
||||
ExifByteOrder byteOrder = exif_data_get_byte_order(exifData);
|
||||
ExifEntry *exifEntry = exif_data_get_entry(exifData, EXIF_TAG_ORIENTATION);
|
||||
|
||||
if (exifEntry)
|
||||
{
|
||||
orientation = exif_get_short(exifEntry->data, byteOrder);
|
||||
}
|
||||
exif_data_free(exifData);
|
||||
}
|
||||
|
||||
int degrees = 0;
|
||||
switch(orientation) {
|
||||
case 8:
|
||||
degrees = 270;
|
||||
break;
|
||||
case 3:
|
||||
degrees = 180;
|
||||
break;
|
||||
case 6:
|
||||
degrees = 90;
|
||||
break;
|
||||
}
|
||||
return degrees;
|
||||
}
|
||||
|
||||
bool ImageSelector::imageValidForAspect(const std::string &fileName)
|
||||
{
|
||||
QPixmap p( fileName.c_str() );
|
||||
int imageWidth = p.width();
|
||||
int imageHeight = p.height();
|
||||
int rotation = getImageRotation(fileName);
|
||||
if ( rotation == 90 || rotation == 270 )
|
||||
{
|
||||
std::swap(imageWidth,imageHeight);
|
||||
}
|
||||
|
||||
switch(_aspect)
|
||||
{
|
||||
case 'a':
|
||||
// allow all
|
||||
break;
|
||||
case 'l':
|
||||
if ( imageWidth < imageHeight )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 'p':
|
||||
if ( imageHeight < imageWidth )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
RandomImageSelector::RandomImageSelector(std::unique_ptr<PathTraverser>& pathTraverser, char aspect):
|
||||
ImageSelector(pathTraverser, aspect)
|
||||
{
|
||||
srand (time(NULL));
|
||||
}
|
||||
@@ -31,9 +96,17 @@ std::string RandomImageSelector::getNextImage()
|
||||
std:: string filename;
|
||||
try
|
||||
{
|
||||
QStringList images = pathTraverser->getImages();
|
||||
unsigned int selectedImage = selectRandom(images);
|
||||
filename = pathTraverser->getImagePath(images.at(selectedImage).toStdString());
|
||||
while (filename.empty())
|
||||
{
|
||||
QStringList images = pathTraverser->getImages();
|
||||
unsigned int selectedImage = selectRandom(images);
|
||||
filename = pathTraverser->getImagePath(images.at(selectedImage).toStdString());
|
||||
if (!imageValidForAspect(filename))
|
||||
{
|
||||
filename.clear();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch(const std::string& err)
|
||||
{
|
||||
@@ -53,8 +126,8 @@ unsigned int RandomImageSelector::selectRandom(const QStringList& images) const
|
||||
return rand() % images.size();
|
||||
}
|
||||
|
||||
ShuffleImageSelector::ShuffleImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
|
||||
ImageSelector(pathTraverser),
|
||||
ShuffleImageSelector::ShuffleImageSelector(std::unique_ptr<PathTraverser>& pathTraverser, char aspect):
|
||||
ImageSelector(pathTraverser, aspect),
|
||||
current_image_shuffle(-1),
|
||||
images()
|
||||
{
|
||||
@@ -92,8 +165,8 @@ std::string ShuffleImageSelector::getNextImage()
|
||||
return filename;
|
||||
}
|
||||
|
||||
SortedImageSelector::SortedImageSelector(std::unique_ptr<PathTraverser>& pathTraverser):
|
||||
ImageSelector(pathTraverser),
|
||||
SortedImageSelector::SortedImageSelector(std::unique_ptr<PathTraverser>& pathTraverser, char aspect):
|
||||
ImageSelector(pathTraverser, aspect),
|
||||
images()
|
||||
{
|
||||
srand (time(NULL));
|
||||
|
||||
Reference in New Issue
Block a user