2011-09-28 11 views
8

Come posso fare a livello di programmazione tramite java convertire un'immagine in "una stringa" per passarla come parametro per la ricerca in ricerca di immagini google. In realtà ho fatto qualche conversione di base64 dell'immagine ma differisce da quella che google fa nel suo motore di ricerca di immagini. Ho fatto una tale conversione (Java 7):Ricerca immagini Google: come si costruisce un URL di ricerca immagine inversa?

import javax.xml.bind.DatatypeConverter; 
... 
      Path p = Paths.get("my_photo.JPG"); 
      try(InputStream in = Files.newInputStream(p); 
        PrintWriter write = new PrintWriter("base64.txt"); 
       ) { 
       byte [] bytes = new byte[in.available()]; 
       in.read(bytes); 
       String base64 = DatatypeConverter.printBase64Binary(bytes); 
       write.println(base64); 

      } catch(IOException ex) { 
       ex.printStackTrace(); 
      } 

l'uscita di questo semplice programma differisce dal stringa del google in url. Parlo di quella stringa che va dopo tbs=sbi:AMhZZ...

+0

quindi, posso utilizzare questo servizio di Google in un altro modo. Voglio semplicemente ottenere il codice di una pagina di immagine specificata, come in ricerca di immagini di google – maks

+0

Non capisco cosa stai cercando di realizzare. Puoi fare un esempio? – mikerobi

+0

voglio utilizzare un servizio di ricerca di immagini google come in http://code.google.com/intl/uk/apis/imagesearch/v1/jsondevguide.html#json_snippets_java ma invece dei parametri di testo voglio usare l'immagine come parametro (nota: non ho bisogno di usare json, semplicemente sta usando nell'esempio) – maks

risposta

11

Questo è il mio migliore ipotesi per come funziona la ricerca di immagini:

I dati nell'URL non è una forma codificata dell'immagine. I dati sono un'impronta digitale dell'immagine utilizzata per la corrispondenza fuzzy.

Si dovrebbe notare che quando si carica un'immagine per la ricerca, si tratta di un processo in 2 fasi. Il primo passaggio carica l'immagine tramite l'url http://images.google.com/searchbyimage/upload. Il server di Google restituisce l'impronta digitale. Il browser viene quindi reindirizzato a una pagina di ricerca con una stringa di query basata sull'impronta digitale.

A meno che Google non pubblichi l'algoritmo per la generazione dell'impronta digitale, non sarà possibile generare la stringa della query di ricerca dall'interno dell'applicazione. Fino ad allora, puoi fare in modo che la tua applicazione pubblichi l'immagine nell'URI di caricamento. Dovresti essere in grado di analizzare la risposta e costruire la stringa di query.

EDIT

Queste sono le chiavi ei valori inviati al server quando ho caricato un file.

image_url  = 
btnG   = Search 
encoded_image = // the binary image content goes here 
image_content = 
filename  = 
hl    = en 
bih    = 507 
biw    = 1920 

"bih" e "biw" sembrano dimensioni, ma non corrispondono al file caricato.

Utilizzare queste informazioni a proprio rischio. È un'API non documentata che potrebbe cambiare e rompere la tua applicazione.

+1

Grazie, immagino di cosa stai parlando. Puoi descrivere o dare un esempio di come posso fare una richiesta di post con l'immagine a quell'URL? – maks

+1

@maks, spero che la mia modifica sia più utile. È necessario codificare la chiave/i valori come "multipart/form-data" e inviarlo come corpo della richiesta POST. Dovresti riuscire a trovare molti esempi su come eseguire la codifica. – mikerobi

+0

Puoi per favore chiarire di più su questo ... Sto cercando di fare lo stesso su WindowsPhone7 – 1Mayur

7
Using google's image search. 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.entity.mime.content.StringBody; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class HttpFileUpload { 
    public static void main(String args[]){ 
    try { 
     HttpClient client = new DefaultHttpClient(); 
     String url="https://www.google.co.in/searchbyimage/upload"; 
     String imageFile="c:\\temp\\shirt.jpg"; 
     HttpPost post = new HttpPost(url); 

     MultipartEntity entity = new MultipartEntity(); 
     entity.addPart("encoded_image", new FileBody(new File(imageFile))); 
     entity.addPart("image_url",new StringBody("")); 
     entity.addPart("image_content",new StringBody("")); 
     entity.addPart("filename",new StringBody("")); 
     entity.addPart("h1",new StringBody("en")); 
     entity.addPart("bih",new StringBody("179")); 
     entity.addPart("biw",new StringBody("1600")); 

     post.setEntity(entity); 
     HttpResponse response = client.execute(post); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));   

     String line = ""; 
     while ((line = rd.readLine()) != null) { 
     if (line.indexOf("HREF")>0) 
     System.out.println(line.substring(8)); 
     } 

    }catch (ClientProtocolException cpx){ 
     cpx.printStackTrace(); 
    }catch (IOException ioex){ 
     ioex.printStackTrace(); 
    } 
} 
} 
+0

solo il parametro "encode_image" è richiesto, i parametri di riposo non sono richiesti. –

2

Sulla base @ risposta di Ajit, questo non fa lo stesso, ma utilizzando il comando curl (Linux/Cygwin/etc)

curl -s -F "image_url=" -F "image_content=" -F "filename=" -F "h1=en" -F "bih=179" -F "biw=1600" -F "[email protected]_image_file.jpg" https://www.google.co.in/searchbyimage/upload 

Questo stamperà un URL sullo standard output. È possibile scaricare quell'URL con curl o wget ma potrebbe essere necessario modificare l'Agente utente con quello di un browser Web grafico come Chrome.

Problemi correlati