2014-09-25 4 views
1

~ 150 이미지를 고해상도 (~ 5 MB 각 이미지)로 동시에 표시해야합니다. 문제는 모든 이미지를 동시에로드하는 데 많은 시간이 필요하다는 것입니다. 그래서 저는 처음에는 저해상도 이미지를 보여주고 그 동안에는 배경에서 진정한 고해상도 이미지를로드하려고합니다. 그런 다음 준비가되면 스위치를 켭니다.저해상도 이미지를 고해상도 이미지로 바꾸기

답변

-1

잠시 후 나는이 해결책으로 끝냈다. 우선은 낮은 해상도의 이미지를로드하고 나는 그리드에 추가 :

BackgroundWorker bgw = new BackgroundWorker(); 
bgw.DoWork += (s, args) => 
{ 
    int i = 0; 
    foreach (var extElem in _imgList) 
    { 
     String url = extElem.HighResImageUri; 
     Image img = _imgList.ElementAt(i); 

     BitmapImage bi = new BitmapImage(); 
     bi.BeginInit(); 
     bi.UriSource = new Uri(url, UriKind.Absolute); 
     bi.EndInit(); 
     bi.Freeze(); 

     Dispatcher.BeginInvoke((Action)(() => 
     { 
      img.Source = bi; 
     })); 
    } 
    i++; 
} 
bgw.RunWorkerAsync(); 
+0

-1. 좋은 솔루션은 코드에서 UI 요소를 만들고 조작하는 대신 적절한 DataTemplate 및 뷰 모델을 사용하여 ItemsControl을 사용했을 것입니다. 웹에서 'MVVM'을 검색하십시오. – Clemens

+0

그래, 나는 그렇게했다. 나는 ItemsControl, DataTemplate 등을 사용했다. 그러나 나는 더 복잡한 애플리케이션을 가지고 있고, 내가 여기서 설명한 것과 그 이미지는 150 개가 넘는 "base.Internalchildren"이미지의 오버레이에있다. 2000) 애니메이션을 부드럽게 재생할 수 있도록 낮은 해상도로 렌더링됩니다. – Marco

+0

그러면 여기에 대한 답은 BackgroundWorker에서 작업하는 방법을 보여주는 것입니다. – Clemens

0

: 다음

foreach (var extElem in ElemList) 
{ 
    IdImage img = new IdImage(); 
    img.Id = extElem.ImageID; 
    img.CollectionId = extElem.CollectionID; 
    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.UriSource = new Uri(extElem.Url, UriKind.Absolute); 
    bi.DecodePixelWidth = 200; //If you want to further reduce the image size (and load time) 
    bi.EndInit(); 
    img.Source = bi; 
    grid.Children.Add(img); 

    _imgList.Add(img); 
} 

나는 이미지에게 고해상도를로드하고 비트 맵의 ​​원본을 변경하는 백그라운드 작업을 시작합니다 나는 그 C# 코드를 모두 신경 쓰지 않을 것이다. 대신 컬렉션 컨트롤과 파일 경로 모음을 사용합니다. 이 예제를보십시오 :

<ListBox ItemsSource="{Binding FilePaths}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Image Source="{Binding}" Width="250" Stretch="Uniform" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

...

private ObservableCollection<string> filePaths = new ObservableCollection<string>(); 
public ObservableCollection<string> FilePaths 
{ 
    get { return filePaths; } 
    set { filePaths = value; NotifyPropertyChanged("FilePaths"); } 
} 

...

FilePaths = new ObservableCollection<string>(Directory.GetFiles(
    Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "*.png")); 
+0

이렇게하면 빠른 시작을 위해 저해상도 이미지를로드 한 다음 고해상도 버전을 백그라운드로로드 할 수 있습니까? – Marco

+0

여기에서 언급 한 저해상도 이미지에 액세스 할 수있는 경우 [Binding.IsAsync] (http://msdn.microsoft.com/en-us/library)의 예제 섹션에서 설명한대로 IsAsync 속성과 함께 PriorityBinding을 사용할 수 있습니다. /system.windows.data.binding.isasync(v=vs.110).aspx) – 0xBADF00D