2009-04-23 6 views
6

WCF 서비스에서 이미지를 전달하고 통과 한 후 WPF 데이터 격자에 표시하는 가장 좋은 방법은 무엇입니까?WCF를 통해 이미지를 전달하고 WPF 데이터 격자에 표시

+0

처리중인 이미지의 평균 크기는 얼마나됩니까? 얼마나 많은 사람들이 한 번의 통화로 대처해야합니까? 질문에 대한 여러 가지 좋은 해결책이 있지만 실제로 각 통화에서 처리해야하는 정보의 양에 따라 달라집니다. 바이트 배열로 반환하면 이미지가 비교적 작을 것이고 한 번에 많은 수를 반환하지 않아도 좋은 해결책 일뿐입니다 (데이터 그리드에 넣기 때문에 묻습니다. –

답변

8

나는이 유일한 또는 가장 좋은 방법입니다 말하는 게 아니에요,하지만 우리는이 같은 일이 :

당신이해야 할 것은 :

는 이미지를 반환 것 WCF 방법을 만들기 어떤 이드 든 뭐든간에. 그것은 바이트 배열 (byte []) 반환해야합니다 : 데이터 클래스 (그리드에 표시 객체) 속성 이미지를 만들기에서

public byte[] GetImage(int id) 
{ 
    // put your logic of retrieving image on the server side here 
} 

을의 WCF 메서드를 호출하고 BitmapImage에 바이트 배열을 변환해야 그 게터 :

UI를 자유 케하지 않도록

<DataTemplate> <!-- Can be a ControlTemplate as well, depends on where and how you use it --> 
    <Image 
    Source={Binding Image, IsAsync=true} 
    /> 
</DataTemplate> 

가장 간단한 방법 : 휴대 템플릿 (또는 어디든지) 이미지 컨트롤을 넣고 위에서 만든 이미지 속성의 소스 속성을 바인딩에

public BitmapImage Image 
{ 
    get 
    { 
    // here - connection is your wcf connection interface 
    //  this.ImageId is id of the image. This parameter can be basically anything 
    byte[] imageData = connection.GetImage(this.ImageId);  

    // Load the bitmap from the received byte[] array 
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageData, 0, imageData.Length, false, true)) 
    { 
    BitmapImage bmp = new BitmapImage(); 
    bmp.BeginInit(); 
    bmp.StreamSource = stream; 

    try 
     { 
     bmp.EndInit(); 
     bmp.Freeze(); // helps for performance 

     return bmp; 
     } 
    catch (Exception ex) 
     { 
     // Handle exceptions here 
     } 

    return null; // return nothing (or some default image) if request fails 
    } 
    } 
} 

이미지를 검색 할 때 내가했던 것처럼 IsAsync 속성을 false로 설정할 것입니다. 그러나 개선해야 할 부분이 많이 있습니다. 예 : 이미지를로드하는 동안로드 애니메이션을 일부 표시 할 수 있습니다.

다른 것을로드하는 동안 뭔가 표시하는 것은 PriorityBinding을 사용하여 수행 할 수 있습니다 (여기에서 읽을 수 있습니다 : http://msdn.microsoft.com/en-us/library/ms753174.aspx).

+0

이미지를로드하는 동안 애니메이션을 표시하는 방법은 무엇입니까? –

+0

답변을 업데이트했습니다 – arconaut

+0

이것은 이미지가 작 으면 좋은 답변 일뿐입니다. . 이미지의 크기에 따라 다릅니다. 크기가 크거나 많은 양의 요청이있는 경우이 솔루션은 작동하지 않습니다. –

0

스트림에서 WPF 이미지를로드 할 수 있습니까? 그렇다면 WCF 서비스를 작성하여 System.IO.Stream 유형을 반환 할 수 있습니다.

+1

내가 그 이유를 묻는 이유는 모르겠다. –

+0

스트림이 메시지의 유일한 부분으로 표시되어있는 한 메시지의 일부로 스트림을 보낼 수 있습니다. 메시지의 다른 모든 필드는 헤더로 이동해야합니다. – SaguiItay

관련 문제