2011-09-28 21 views
8

¿Cómo puedo convertir mediante programación java una imagen a "alguna cadena" para pasarla como un parámetro para buscar en la búsqueda de imágenes de google? En realidad, he hecho una conversión base64 de imagen, pero difiere de la que hace Google en su motor de búsqueda de imágenes. He hecho una conversión tal (Java 7):Búsqueda de imágenes de Google: ¿cómo puedo construir una URL de búsqueda de imágenes 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(); 
      } 

la salida de este sencillo programa difiere de la secuencia del Google en la URL. Me refiero a que la cadena que va después de tbs=sbi:AMhZZ...

+0

Entonces, ¿puedo usar este servicio de Google de otra manera? Simplemente quiero obtener el código de una página de la imagen especificada, como en la búsqueda de imágenes de Google – maks

+0

No entiendo lo que estás tratando de lograr. ¿Puede dar un ejemplo? – mikerobi

+0

Quiero utilizar un servicio de búsqueda de imágenes de google como en http://code.google.com/intl/uk/apis/imagesearch/v1/jsondevguide.html#json_snippets_java pero en lugar de los parámetros de texto, quiero usar la imagen como parámetro (nota: no necesito usar json, simplemente lo está usando en el ejemplo) – maks

Respuesta

11

Ésta es mi mejor estimación de cómo funciona la búsqueda de imágenes:

Los datos de la URL no es una forma codificada de la imagen. Los datos son una huella dactilar de imagen utilizada para la concordancia difusa.

Debería notar que cuando carga una imagen para buscar, es un proceso de 2 pasos. El primer paso carga la imagen a través de la url http://images.google.com/searchbyimage/upload. El servidor de Google devuelve la huella digital. El navegador se redirige a una página de búsqueda con una cadena de consulta basada en la huella digital.

A menos que Google publique el algoritmo para generar la huella digital, no podrá generar la cadena de consulta de búsqueda desde su aplicación. Hasta entonces, puede hacer que su aplicación publique la imagen en el URI de carga. Debería poder analizar la respuesta y construir la cadena de consulta.

EDITAR

Estas son las claves y los valores enviados al servidor cuando he subido un archivo.

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

"bih" y "biw" parecen dimensiones, pero no corresponden al archivo cargado.

Utilice esta información bajo su propio riesgo. Es una API indocumentada que podría cambiar y romper su aplicación.

+1

Gracias, supongo que de lo que estás hablando. ¿Puede describir o dar un ejemplo de cómo puedo hacer una solicitud posterior con imagen a esa url? – maks

+1

@maks, espero que mi edición sea más útil. Debe codificar las claves/valores como "multipart/form-data" y enviarlos como cuerpo de solicitud POST. Debería poder encontrar muchos ejemplos sobre cómo hacer la codificación. – mikerobi

+0

Puede aclarar más sobre esto ... Estoy tratando de hacer lo mismo en 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 se requiere el parámetro "encode_image", los parámetros de reposo no son necesarios. –

2

@ Sobre la base de la respuesta de Ajit, esto hace lo mismo pero usando el 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 

Esto imprimirá una dirección URL en la salida estándar. Puede descargar esa URL con curl o wget, pero es posible que tenga que cambiar el agente de usuario por el de un navegador web gráfico como Chrome.

Cuestiones relacionadas