2016-03-15 15 views
6

Tôi đã sử dụng mã từ http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-save để đổi kích thước hình ảnh theo lập trình. Tuy nhiên, dự án đó sử dụng thư viện System.Drawing, không có sẵn cho các ứng dụng Windows 10.Cách Sao chép và Đổi kích thước Hình ảnh trong Windows 10 UWP

Tôi đã thử bằng cách sử dụng lớp BitmapImage từ Windows.UI.Xaml.Media.Imaging thay vào đó, nhưng nó dường như không cung cấp các chức năng đã được tìm thấy trong System.Drawing ..

Có ai có bất kỳ may mắn là có thể thay đổi kích thước (quy mô xuống) hình ảnh trong Windows 10? Ứng dụng của tôi sẽ xử lý hình ảnh từ nhiều nguồn, ở các định dạng/kích thước khác nhau và tôi đang cố gắng thay đổi kích thước hình ảnh thực tế để tiết kiệm dung lượng, thay vì chỉ cho phép ứng dụng kích thước phù hợp với Image mà nó đang được hiển thị.

EDIT

tôi đã sửa đổi mã từ liên kết nêu trên, và có một hack mà làm việc cho nhu cầu cụ thể của tôi. Ở đây là:

public static BitmapImage ResizedImage(BitmapImage sourceImage, int maxWidth, int maxHeight) 
{ 
    var origHeight = sourceImage.PixelHeight; 
    var origWidth = sourceImage.PixelWidth; 
    var ratioX = maxWidth/(float) origWidth; 
    var ratioY = maxHeight/(float) origHeight; 
    var ratio = Math.Min(ratioX, ratioY); 
    var newHeight = (int) (origHeight * ratio); 
    var newWidth = (int) (origWidth * ratio); 

    sourceImage.DecodePixelWidth = newWidth; 
    sourceImage.DecodePixelHeight = newHeight; 

    return sourceImage; 
} 

Bằng cách này dường như làm việc, nhưng lý tưởng hơn là thay đổi bản gốc BitmapImage, tôi muốn tạo ra một mới/bản sao của nó để sửa đổi và trở lại để thay thế.

Dưới đây là một ảnh chụp của nó trong hành động: screenshot of resized image

+0

Tiêu đề gây hiểu lầm, OP. Bạn có một cách để thay đổi kích thước hình ảnh, những gì bạn thực sự muốn làm là tạo một bản sao của hình ảnh gốc, thay đổi kích thước bản sao, sau đó trả lại bản sao. –

+0

@BrianDriscoll Tôi đã đăng câu hỏi trước khi chỉnh sửa. Bản chỉnh sửa đã thêm mã để thay đổi kích thước hình ảnh gốc. Tôi đã đăng nó như một câu trả lời, nhưng nó vẫn chưa đủ dài. Nhưng tôi thích tựa đề mới. Cảm ơn. –

+0

Bạn có thể tạo một hằng số của hình ảnh không? Hoặc một tài sản riêng tư, bạn chỉ có thể tham khảo bản gốc của hình ảnh và sử dụng chức năng tương tự? – aguertin

Trả lời

7

tôi có thể muốn trả về một bản sao của bản gốc BitmapImage hơn là thay đổi bản gốc.

Không có phương pháp tốt để sao chép trực tiếp BitmapImage, nhưng chúng tôi có thể sử dụng lại StorageFile nhiều lần.

Nếu bạn chỉ muốn chọn một hình ảnh, hiển thị nó và trong khi đó hiển thị các hình ảnh lại có kích thước của một bản gốc, bạn có thể vượt qua StorageFile như tham số như thế này:

public static async Task<BitmapImage> ResizedImage(StorageFile ImageFile, int maxWidth, int maxHeight) 
{ 
    IRandomAccessStream inputstream = await ImageFile.OpenReadAsync(); 
    BitmapImage sourceImage = new BitmapImage(); 
    sourceImage.SetSource(inputstream); 
    var origHeight = sourceImage.PixelHeight; 
    var origWidth = sourceImage.PixelWidth; 
    var ratioX = maxWidth/(float)origWidth; 
    var ratioY = maxHeight/(float)origHeight; 
    var ratio = Math.Min(ratioX, ratioY); 
    var newHeight = (int)(origHeight * ratio); 
    var newWidth = (int)(origWidth * ratio); 

    sourceImage.DecodePixelWidth = newWidth; 
    sourceImage.DecodePixelHeight = newHeight; 

    return sourceImage; 
} 

Trong kịch bản này, bạn chỉ cần gọi nhiệm vụ này và hiển thị các hình ảnh lại có kích thước như thế này:

smallImage.Source = await ResizedImage(file, 250, 250); 

Nếu bạn muốn giữ lại các thông số BitmapImage do một số lý do (như sourceImage có thể là một bitmap sửa đổi nhưng không được nạp trực tiếp từ tập tin), và bạn muốn t o kích thước lại hình ảnh mới này sang hình khác, bạn sẽ cần phải lưu lại hình ảnh có kích thước như một tệp lúc đầu, sau đó mở tệp này và kích thước lại nó.

+0

Điều này thật tuyệt vời, cảm ơn Grace.Có cách nào để có được 'BitmapImage' hoặc' IRandomAccessStream' vào một 'WriteableBitmap' hoặc' RenderTargetBitmap' để mã hóa thành chuỗi base64 không? Tôi có thể thực hiện 'StorageFile' trực tiếp, nhưng vì hình ảnh đã thay đổi kích thước không phải là một' StorageFile', tôi cần đưa nó trở lại vào một kiểu dữ liệu khác để mã hóa. –

+0

Tôi đã thay đổi toàn bộ quá trình để sử dụng 'WriteableBitmap' thay vì' BitmapImage' để tôi có hình ảnh ở định dạng cần thiết để mã hóa thành base64. Tôi vẫn phải tạo một 'BitmapImage' bên trong hàm' ResizedImage' để lấy kích thước ban đầu, nhưng ít nhất nó hoạt động :) –

+0

@dubstylee, bạn đang thực hiện nó đúng cách, tôi không thể tìm cách chuyển đổi ' BitmapImage' đến chuỗi 64base. Để có được «IRandomAccessStream' đến' WriteableBitmap', bạn có thể sử dụng 'BitmapDecoder', nhưng tôi nghĩ bạn đã biết điều này. –

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