2010-12-30 37 views
16

Używając JavaScript, robię wywołanie AJAX do usługi WCF i zwraca tablicę bajtów. Jak mogę przekonwertować to na obraz i wyświetlić go na stronie internetowej?(Javascript) Konwertuj bajt [] na obraz

+0

Zastanawiam się, czy można zmodyfikować typ odpowiedzi z usługi? Czy to tylko czyste bajty? – Lloyd

+0

Nawet jeśli możesz "przekonwertować go na obraz", nie jestem pewien, w jaki sposób umieścisz go w DOM. W pewnym sensie należałoby go przywołać jako zasób. Interesujące pytanie. – David

Odpowiedz

4

Zamiast wywoływania usługi AJAX użyć Javascript zbudować element obrazu i skierować go do służby bezpośrednio ...

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

Wystarczy upewnić się, że usługa ustawia typ zawartości prawidłowo.

+0

ok .. że * prawie * działa. Pamiętaj, że powiedziałem, że dzwonię do usługi WCF. To, co otrzymuję, wygląda następująco: "{" d ": [66,77,230,11,0,0,0,0,0,0,54,0,0,0,40,0,0,0,22, 0,0,0,34,0,0,0,1 ... itd. "Jest tak prawdopodobnie dlatego, że mam atrybut WebInvoke ustawiony jako: [WebInvoke (Method =" GET ", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] Tak więc pytanie brzmi: jak powinien wyglądać WebInvokeAttribute WCF? – KevinDeus

+0

@Kevin Możesz potrzebować bardziej przyjaznego dla HTTP opakowania dla twojej usługi.Na przykład ogólny program obsługi, który wywołuje usługę i strumieniuje tablicę bajtów za pomocą 'Response.BinaryWrite' i ustawia typ zawartości na" image/jpeg ". To powinno działać. –

+0

hmm. Zmieniłem OutgoingResponse.ContentType w usłudze internetowej (WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";), ale to nadal by tego nie robiło. Aby to, co mówisz, zadziałało, zmieniłem wyjście funkcji usługi na System.Io.Stream – KevinDeus

16

Zdaję sobie sprawę, że jest to stary wątek, ale udało mi się zrobić to za pośrednictwem wywołania AJAX na usługi internetowej i myślałem, że będę dzielić ...

  • mam obraz w mojej strony już:

    <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]; 
           } 
          } 
         } 
        }); 
    

Mój kod 'GetItemPreview' odpytuje serwer SQL, gdzie mam obraz zapisany jako ciąg base64 i zwraca to pole jako 'wyników':

 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); 

magia jest w zaproszeniu AJAX na tej linii:

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

Ciesz się!

+1

Dziękuję, tego właśnie szukałem! – MorningDew

+1

Zrobiłem skrzypce z prostym przykładem: https://jsfiddle.net/wtrovae8/ – Gaunt

0

Wystarczy odesłać go jako Base64 potem po prostu:

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

W moim przypadku używam HiddenInput z Id z Signature przechowywać że Base64 dane

2

Oto źródło JavaScript, żeby dekodować PNG, JPEG i GIF bajty obrazu, przy użyciu schematu URI danych:

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

Używanie jQuery jako przykładu:

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