2012-02-16 20 views
5

Ứng dụng của tôi sử dụng máy ảnh để chụp ảnh và tải nó lên Flickr. Tôi muốn nén hình ảnh xuống để quá trình tải lên không mất thời gian như hiện tại. Tôi đã thử cả BitmapSource và phương thức 'SaveJpeg' của WriteableBitmap để thực hiện điều này nhưng không thành công. Nguồn bitmap không có các thành viên tương tự có sẵn trong Silverlight/WP như trong phiên bản .NET framework đầy đủ và phương thức SaveJpeg mà WriteableBitmap đã giữ cho tôi một lỗi 'Dòng này không hỗ trợ ghi vào nó'.Làm cách nào để tôi nén hình ảnh trên Windows Phone

Đây là những gì tôi hiện đang làm trong CameraCaptureTask xử lý sự kiện hoàn thành của tôi:

private void CameraCaptureCompleted(object sender, PhotoResult e) 
    { 
     if (e == null || e.TaskResult != TaskResult.OK) 
     { 
      return; 
     }                
     BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};       
     bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto)); 
     WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap); 

     // Encode the WriteableBitmap object to a JPEG stream. 
     writeableBitmap.SaveJpeg(e.ChosenPhoto, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85); 
    } 

Mã này mang lại cho tôi một: "Dòng không hỗ trợ viết" lỗi.

Có cách nào khác để tôi có thể nén hình ảnh hoặc tôi có phải viết một thuật toán nén không?

CẬP NHẬT CỐ ĐỊNH !!

private void CameraCaptureCompleted(object sender, PhotoResult e) 
    { 
     if (e == null || e.TaskResult != TaskResult.OK) 
     { 
      return; 
     }                
     BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};       
     bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto)); 
     WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap); 

     // Encode the WriteableBitmap object to a JPEG stream. 
     writeableBitmap.SaveJpeg(new MemoryStream(), writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85); 
    } 

Tôi đã cố gắng ghi vào luồng nguồn. Doh!

Cảm ơn.

+0

PhotoResult e không phải là luồng nên SaveJpeg sẽ không hoạt động nhắm mục tiêu, bạn muốn lưu ảnh của mình vào đâu? IsolatedStorage hoặc một luồng tạm thời hoặc ở một nơi khác ... – ameer

+1

Để bạn biết, khi bạn lưu nó vào MemoryStream mới(), bạn không có tham chiếu đến nơi bạn đã lưu nó ngay bây giờ, tốt nhất để tạo luồng bộ nhớ trước, chuyển nó vào luồng bộ nhớ sau đó một khi bạn nhận được nó nén hoặc tải nó trực tiếp từ dòng bộ nhớ hoặc lưu nó vào bộ nhớ bị cô lập và tải nó lên sau. – ameer

Trả lời

3

SaveJpeg là cách tôi sẽ làm điều này tôi nghĩ. Bạn có thể có thể làm điều đó một số cách khác nhưng tôi nghĩ rằng đó sẽ là dễ nhất và tự nhiên nhất. Lỗi 'Luồng này không hỗ trợ ghi vào nó' có khả năng là vì bất kỳ luồng nào bạn đang truyền tới SaveJpeg, nó không thể ghi được. Tôi không chắc chắn chính xác những gì bạn đang cố gắng viết, hãy thử sử dụng một luồng bộ nhớ cũ đơn giản và xem có hoạt động như vậy không

using System.IO; 

// ... 

MemoryStream ms = new MemoryStream(); 
pic.SaveJpeg(ms, pic.PixelWidth, pic.PixelHeight, 0, 0, 50); 

Bạn có thể điều chỉnh chất lượng trong thông số cuối cùng. PixelWidth/Chiều cao là từ WriteableBitmap vì vậy nếu bạn có một số nguồn khác, bạn có thể phải sử dụng phương pháp/thuộc tính khác để có chiều rộng/chiều cao. Bạn có thể muốn mở rộng quy mô này vì các hình ảnh từ máy ảnh có thể khá lớn. Nó phụ thuộc vào những gì bạn đang tải lên những hình ảnh này nhưng mở rộng chúng, bạn có thể làm cho kích thước tập tin nhỏ hơn là tốt.

+0

Cảm ơn bạn đã trả lời ameer. Tôi đã cập nhật bài đăng của mình bằng đoạn mã ở trên. Đó là những gì tôi hiện đang phải đối mặt. – Cranialsurge

Các vấn đề liên quan