diff options
Diffstat (limited to 'offsetProject/src/imageStore.h')
| -rw-r--r-- | offsetProject/src/imageStore.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/offsetProject/src/imageStore.h b/offsetProject/src/imageStore.h new file mode 100644 index 0000000..3cfb7eb --- /dev/null +++ b/offsetProject/src/imageStore.h @@ -0,0 +1,142 @@ +#pragma once + +#define IMAGE_STORE_SIZE 256 + +#define MIN_TILE_SIZE 8 +#define MAX_TILE_SIZE 32 + +#include "ofMain.h" +#include "ofxJSONElement.h" + +long ofToLong(const string& intString); + +class imageStore : public ofThread{ + + public: + + float interval; //time between refreshes in seconds + + std::string instagram_url; + ofxJSONElement response; + std::map<std::string,ofImage> images; + deque<std::string> to_update; + + imageStore(){ + instagram_url = "https://api.instagram.com/v1/tags/tycleeson/media/recent?client_id=c1d74d701fdf4ddd9f8d30ee9e8f944b"; + interval=5.00f; + } + + void set_interval(float _interval){ + interval=_interval; + } + + void start(){ + startThread(true, false); // blocking, verbose + } + + void stop(){ + stopThread(); + } + + //-------------------------- + void threadedFunction(){ + + //1st get the pre-existing images + + ofDirectory image_path(ofToString(IMAGE_STORE_SIZE)+"/"); + cerr<<"image path: "<<image_path.getAbsolutePath()<<endl; + if (image_path.exists()){ + image_path.listDir(); + cerr<<"image path found, "<<image_path.size()<<" images"<<endl; + for (int i=0;i<image_path.size();i++){ + ofImage img; + img.setUseTexture(false); + img.loadImage(ofToString(IMAGE_STORE_SIZE)+"/"+image_path.getFiles()[i].getFileName()); + img.resize(MAX_TILE_SIZE,MAX_TILE_SIZE); + if( lock() ){ + images[image_path.getFiles()[i].getBaseName()]=img; + to_update.push_back(image_path.getFiles()[i].getBaseName()); + unlock(); + } + } + } + else { + cerr<<"creating image path"<<endl; + image_path.create(); + } + + cout << "Api: " << instagram_url<<endl; + + while( isThreadRunning() != 0 ){ + + cout<<"."<<std::flush; + + if (!response.open(instagram_url)) { + cout << "Failed to parse JSON\n" << endl; + } + else { //int numImages = MIN(5,response["data"].size()); + + + for(int i=0; i< response["data"].size(); i++) { + //cout << "response " <<response["data"][i]["caption"]["id"].asString()<< endl; + + if (images.find(response["data"][i]["caption"]["id"].asString())==images.end()){ + std::string url = response["data"][i]["images"]["standard_resolution"]["url"].asString(); + std::string id = response["data"][i]["caption"]["id"].asString(); + cout<<"fetching "<<id<<":"<<instagram_url<<endl; + + ofImage img; + img.setUseTexture(false); + img.loadImage(url); + img.resize(IMAGE_STORE_SIZE,IMAGE_STORE_SIZE); + img.saveImage(ofToString(IMAGE_STORE_SIZE)+"/"+id+".png"); + img.resize(MAX_TILE_SIZE,MAX_TILE_SIZE); + if( lock() ){ + images[id]=img; + to_update.push_back(id); + unlock(); + } + } + } + } + ofSleepMillis(interval * 1000); + } + } + + //-------------------------- + void draw(){ + if( lock() ){ + if (to_update.size()){ + std::string im = to_update.front(); + + const ofPixels& pix = images[im].getPixelsRef(); + images[im].getTextureReference().allocate( + pix.getWidth() + ,pix.getHeight() + ,ofGetGlInternalFormat(pix) + ); + + images[im].setUseTexture(true); + images[im].update(); + + to_update.pop_front(); + + int drawcount=0; + for (map<string,ofImage>::iterator i=images.begin();i!=images.end();++i){ + if(i->second.isUsingTexture()){ + drawcount++; + } + } + //cout<<"loaded "<<im<<" "<<ofToLong(im)%(long)(ofGetWidth()-images[im].getWidth()+1)<<","<<ofToLong(im)%(long)(ofGetHeight()-images[im].getHeight()+1)<<endl; + } + for (map<string,ofImage>::iterator i=images.begin();i!=images.end();++i){ + if(i->second.isUsingTexture()){ + i->second.draw(ofToLong(i->first)%(long)(ofGetWidth()-i->second.getWidth()+1),ofToLong(i->first)%(long)(ofGetHeight()-i->second.getHeight()+1)); + } + } + unlock(); + } + } + + +};
\ No newline at end of file |
