2010-12-30 71 views
16

Al usar Javascript, estoy haciendo una llamada AJAX a un servicio WCF y está devolviendo una matriz de bytes. ¿Cómo puedo convertir eso en una imagen y mostrarla en la página web?(Javascript) Convertir byte [] a imagen

+0

Me pregunto si puede modificar el tipo de respuesta del servicio. ¿Solo son solo bytes puros? – Lloyd

+0

Incluso si puede "convertirlo en una imagen", no estoy seguro de cómo lo colocaría en el DOM. Tendría que ser referenciado como un recurso de alguna manera. Interesante pregunta. – David

Respuesta

4

lugar de llamar al servicio con AJAX, Javascript utilizar para construir un elemento de imagen y el punto al servicio directamente ...

var img = document.createElement("IMG"); 
img.src = "http://url/to/service"; 
img.alt = "ALT TEXT"; 
document.body.appendChild(img); 

Sólo asegúrese de que el servicio establece el tipo de contenido correctamente.

+0

ok ... que * casi * funciona. Recuerda que dije que haría una llamada a un servicio de WCF. Lo que recupero se ve así: "{" d ": [66,77,230,11,0,0,0,0,0,0,5,5,0,0,0,40,40,0,0,22, 0,0,0,34,0,0,0,1 ... etc ". Esto es probablemente porque tengo el Atributo WebInvoke establecido como: [WebInvoke (Method =" GET "], BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] Así que la pregunta es ... ¿cómo debería ser WCF WebInvokeAttribute? – KevinDeus

+0

@Kevin Es posible que necesite un envoltorio más compatible con HTTP para su servicio.Por ejemplo, un controlador genérico que invoca el servicio y transmite la matriz de bytes utilizando 'Response.BinaryWrite' y establece el tipo de contenido en" image/jpeg ". Eso funcionaria. –

+0

hmm. Llegué a cambiar el OutgoingResponse.ContentType en el servicio web (WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";), pero eso aún no lo hacía. Para hacer que funcione lo que está diciendo, cambié la salida de la función de servicio a System.Io.Stream – KevinDeus

16

Soy consciente de que es un hilo viejo, pero me las arreglé para hacer esto a través de una llamada AJAX en un servicio web y pensé en compartir ...

  • tengo una imagen en mi página ya:

    <img id="ItemPreview" src="" /> 
    
  • AJAX:

    $.ajax({ 
         type: 'POST', 
         contentType: 'application/json; charset=utf-8', 
         dataType: 'json', 
         timeout: 10000, 
         url: 'Common.asmx/GetItemPreview', 
         data: '{"id":"' + document.getElementById("AwardDropDown").value + '"}', 
         success: function (data) { 
          if (data.d != null) { 
           var results = jQuery.parseJSON(data.d); 
           for (var key in results) { 
            //the results is a base64 string. convert it to an image and assign as 'src' 
            document.getElementById("ItemPreview").src = "data:image/png;base64," + results[key]; 
           } 
          } 
         } 
        }); 
    

Mi código 'GetItemPreview' consulta un servidor SQL en la que tengo una imagen almacenada como una cadena de base 64 y devuelve ese campo como los 'resultados':

 string itemPreview = DB.ExecuteScalar(String.Format("SELECT [avatarImage] FROM [avatar_item_template] WHERE [id] = {0}", DB.Sanitize(id))); 
    results.Add("Success", itemPreview); 
    return json.Serialize(results); 

la magia está en la llamada AJAX en esta línea:

 document.getElementById("ItemPreview").src = "data:image/png;base64," + results[key]; 

¡Disfrútalo!

+1

¡Gracias, esto es lo que estaba buscando! – MorningDew

+1

hice un violín con un simple ejemplo https://jsfiddle.net/wtrovae8/ – Gaunt

0

Sólo tiene que enviar de nuevo como un Base64 entonces simplemente:

var sig = new Image; 
sig.src = 'data:image/png;base64,' + $('#Signature').val(); 

En mi caso estoy usando un HiddenInput con un Id de Signature a almacenar esa Base64 datos

2

Aquí es fuente JavaScript para decodificar Bytes de imagen PNG, JPEG y GIF, utilizando el esquema de URI de datos:

Images.decodeArrayBuffer = function(buffer, onLoad) { 
    var mime; 
    var a = new Uint8Array(buffer); 
    var nb = a.length; 
    if (nb < 4) 
     return null; 
    var b0 = a[0]; 
    var b1 = a[1]; 
    var b2 = a[2]; 
    var b3 = a[3]; 
    if (b0 == 0x89 && b1 == 0x50 && b2 == 0x4E && b3 == 0x47) 
     mime = 'image/png'; 
    else if (b0 == 0xff && b1 == 0xd8) 
     mime = 'image/jpeg'; 
    else if (b0 == 0x47 && b1 == 0x49 && b2 == 0x46) 
     mime = 'image/gif'; 
    else 
     return null; 
    var binary = ""; 
    for (var i = 0; i < nb; i++) 
     binary += String.fromCharCode(a[i]); 
    var base64 = window.btoa(binary); 
    var image = new Image(); 
    image.onload = onLoad; 
    image.src = 'data:' + mime + ';base64,' + base64; 
    return image; 
} 
-1

Uso de jQuery como ejemplo:

var myImage = $('< img src="data:image/jpg; base64," + bytesarray + "/>"');