We are about to switch to a new forum software. Until then we have removed the registration on this forum.
I am trying to pull images from Googles custom search api and some, not all are getting the following error:
Access to Image at 'http://i2.ytimg.com/vi/aaheQ1GW6oc/mqdefault.jpg' from origin 'http://stevehadley.me' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://stevehadley.me' is therefore not allowed access.
I understand that there are restrictions regarding CORS, however my quistion is why is this happening with some images and not others?
See a live prototype here stevehadley.me/static/shoota/
Type anything into the box and hit submit and then some images will load and others won't, how can I modify my code so that I can load all of the images?
current code:
// Google API variables
var imageDataLoaded;
var apis = "https://www.googleapis.com/customsearch/v1?key=AIzaSyDPhPPumxaocG0E0JGhDf69jiI3X7Pjcpc&cx=011817082943782449326:-z21filwace&searchType=image&imgSize=medium&q=";
var apie = "&";
var input;
var image_index;
var imageLink;
// Array the stores all targets
var targets = [];
var target;
var targetImage;
// x and y spawn coordinates for targets
var x;
var y;
var targetX;
var targetY;
// Image that is shown when a target is hit
var deathImage;
function setup() {
createCanvas(windowWidth, windowHeight);
frameRate(2);
imageMode(CENTER);
cursor(CROSS);
var button = select('#submit');
button.mousePressed(getImages);
input = select('#queryString');
function getImages() {
loadJSON(apis + input.value() + apie, gotImages, 'jsonp');
}
}
function gotImages(imageData) {
imageDataLoaded = imageData;
}
gotImages();
function draw() {
x = int(random(windowWidth));
y = int(random(windowHeight));
// Only create targets if google has sent back the images we need
if (imageDataLoaded) {
image_index = int(random(imageDataLoaded.items.length));
imageLink = imageDataLoaded.items[image_index];
targetImage = loadImage(imageLink.link);
// Add new target each frame
targets.push(new Target(x, y, targetImage));
//Clear the screen
fill(255, 255, 255);
rectMode(CORNER);
rect(0, 0, width, height);
// Display all current targets
for (var i = 0; i < targets.length; i++) {
if (imageDataLoaded) {
targets[i].display(targetImage);
}
}
}
}
// Target Class
function Target(x, y, targetImage) {
this.display = function() {
if (imageDataLoaded) {
this.targetX = x;
this.targetY = y;
this.TargetPicture = targetImage;
image(this.TargetPicture, this.targetX, this.targetY, 200, 200);
}
}
}
function mouseClicked() {
for (var i = 0; i < targets.length; i++) {
var distanceChecker = dist(mouseX, mouseY, targets[i].targetX, targets[i].targetY);
// If target is hit
if (distanceChecker < 150) {
fill(255, 0, 255);
// Show explosion when target hit
deathImage = createImg('assets/deathImage.png').hide();
image(deathImage, mouseX, mouseY, 300, 300);
// Remove target from array
targets.splice(i, 1);
}
}
}
Answers
https://forum.Processing.org/two/discussion/11608/i-can-t-display-images-dynamically-loaded-from-web-with-p5-js-always-a-cross-domain-issue
Hi @GoToLoop, I did come across that thread a few days ago but when I read "If you wanna take a shot on that fix, here are the source codes for both loadImage() & createImg():" I figured it was beyond my ability. Thanks for the quick answer and great little hack.