2013-08-26 3 views
1

사용자 데스크톱에서 여러 이미지 파일을 연 다음 해당 이미지를 축소 된 크기로 변환하는 데 문제가 있습니다 (결국 변환 완료). 문제가 정확히 무엇인지는 알 수 없지만 "OpenFileDialog"상자 컨트롤의 "Open"단추를 누르는 것과 파일을 읽어야하는 시간 사이에 5 초 제한이있는 것으로 나타났습니다. (에스). 나는 9-11 메가 바이트의 크기에 이르는 6 개의 파일을 사용했고, 다른 경우에는 50 개의 1-2 메가 바이트 파일을 사용했으며, 모든 경우에 5 초가 만료 될 때까지 프로세스가 읽혀질 것입니다. 그것은 동일한 이미지에서 실패하지 않으므로 이미지가 파일 수 문제가 아니라고 생각하게하는 이슈를 유발하지 않습니다. 몇 개의 작은 크기의 파일로만이 프로세스를 테스트하면 1 초 이내에 오류가 발생하지 않으며 모든 이미지가 UI에 표시됩니다. 그래서 타이밍 문제를 추측하고 있습니다. silverlight는 사용자가 컨트롤 (버튼)과 상호 작용할 때와 "OpenFileDialog"상자를 표시하기 전에 경과 할 수있는 시간 사이의 보안 예외가 있음을 알고 있지만이 시간 제한은 다르지만 어떤 설명서도 찾을 수 없습니다.Silverlight 이미지 업로드에 pixelWidth 또는 pixelHeigth가 없습니다.

여기에 제가 사용하고있는 코드가 있습니다. 그것은 어디에서나 사용하지만 꽤 완성 된 레서피 인 것 같습니다. 이 오류는 라인

var bitmap = new WriteableBitmap(bitmapImage); 

여기 bitmapImage pixelWidth/높이 == 0은 전체 코드 때문에 실패 이유는에 발생합니다.

private const int MaxPixelSize = 500; 

    public byte[] Convert(FileInfo fileInfo, FileTypes fileType, DateTime startTime) 
    { 
     byte[] result = null; 

     using (var stream = fileInfo.OpenRead()) 
     { 
      DateTime EndTime = DateTime.Now; 
      if (fileType == FileTypes.JPG || fileType == FileTypes.BMP || fileType == FileTypes.PNG) 
      { 
       var bitmapImage = new BitmapImage(); 
       bitmapImage.SetSource(stream); 

       double scaleX = 1; 
       double scaleY = 1; 
       if (bitmapImage.PixelWidth > MaxPixelSize) 
       { 
        scaleX = MaxPixelSize/(double)bitmapImage.PixelWidth; 
       } 

       if (bitmapImage.PixelHeight > MaxPixelSize) 
       { 
        scaleY = MaxPixelSize/(double)bitmapImage.PixelHeight; 
       } 
       var scale = Math.Min(scaleX, scaleY); 

       var bitmap = new WriteableBitmap(bitmapImage); 
       var resizedBitmap = bitmap.Resize((int)((double)bitmapImage.PixelWidth * scale), (int)((double)bitmapImage.PixelHeight * scale), WriteableBitmapExtensions.Interpolation.Bilinear); 

       using (var scaleStream = new MemoryStream()) 
       { 
        var encoder = new JpegEncoder(); 
        var image = resizedBitmap.ToImage(); 
        encoder.Encode(image, scaleStream); 

        result = scaleStream.GetBuffer(); 
       } 
      } 
      else 
      { 
       result = new byte[stream.Length]; 
       stream.Read(result, 0, (int)stream.Length); 
      } 
     } 

     return result; 
    } 

모든 도움이나 제안을 환영합니다. bitmapImage.ImageOpened 이벤트가 실행되면

감사합니다,

+0

simular 스레드를 찾았습니다. http://stackoverflow.com/questions/15406315/bitmapimage-returns-0-for-pixelwidth-and-pixelheight –

+0

그 중 하나와 그 해결책이 저를 위해 작동하지 않는다는 것을 알았습니다. 첫째, 나는 그 방법을 사용할 필요가 없다고 생각하기 때문에 5 초 안에 처리하는 동안 코드가 작동하면서 pixelWidth와 Height를 얻을 수 있습니다. 둘째, 나는 그 방법을 시도했지만 ImageOpened 이벤트조차하지 않았다. 비트 맵의 ​​URI 또는 ​​소스를 설정하는 데 차이가 있는지 확실하지 않습니다. 사용자 컴퓨터에서 파일을 사용하고 어셈블리 내에서 파 묻힐 수있는 파일이 아니라 소스에 대한 액세스 권한 만 있습니다. –

답변

0

, 당신은 pixelWidth와 높이 유효을 얻을 수 있습니다. bitmapImage.SetSource(stream)이 실행되면이 이벤트가 호출됩니다.