사용자 데스크톱에서 여러 이미지 파일을 연 다음 해당 이미지를 축소 된 크기로 변환하는 데 문제가 있습니다 (결국 변환 완료). 문제가 정확히 무엇인지는 알 수 없지만 "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
이벤트가 실행되면
감사합니다,
딘
simular 스레드를 찾았습니다. http://stackoverflow.com/questions/15406315/bitmapimage-returns-0-for-pixelwidth-and-pixelheight –
그 중 하나와 그 해결책이 저를 위해 작동하지 않는다는 것을 알았습니다. 첫째, 나는 그 방법을 사용할 필요가 없다고 생각하기 때문에 5 초 안에 처리하는 동안 코드가 작동하면서 pixelWidth와 Height를 얻을 수 있습니다. 둘째, 나는 그 방법을 시도했지만 ImageOpened 이벤트조차하지 않았다. 비트 맵의 URI 또는 소스를 설정하는 데 차이가 있는지 확실하지 않습니다. 사용자 컴퓨터에서 파일을 사용하고 어셈블리 내에서 파 묻힐 수있는 파일이 아니라 소스에 대한 액세스 권한 만 있습니다. –