2016-03-15 10 views
6

Użyłem kodu z http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-save, aby programowo zmienić rozmiar obrazów. Jednak ten projekt korzysta z bibliotek System.Drawing, które nie są dostępne dla aplikacji systemu Windows 10.Jak kopiować i zmieniać rozmiar obrazu w systemie Windows 10 UWP

Próbowałem przy użyciu klasy BitmapImage od Windows.UI.Xaml.Media.Imaging zamiast, ale nie wydaje się, aby zaoferować funkcjonalność, która została znaleziona w System.Drawing ..

Czy ktoś miał szczęście mogąc zmienić rozmiar (skalowanie w dół) w obrazy Windows 10? Moja aplikacja będzie przetwarzać obrazy z wielu źródeł, w różnych formatach/rozmiarach i próbuję zmienić rozmiar rzeczywistych obrazów, aby zaoszczędzić miejsce, zamiast po prostu pozwolić aplikacji dopasować ją do Image, w której jest wyświetlana.

EDIT

Mam zmodyfikowany kod z powyższego linku i mają hack który działa dla mojego konkretnych potrzeb. Oto ona:

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; 
} 

ten sposób wydaje się działać, ale idealnie zamiast modyfikowania oryginalnego BitmapImage, Chciałbym utworzyć nowy/kopię do modyfikowania i powrotu zamiast.

Oto strzał z nim w akcji: screenshot of resized image

+0

Tytuł wprowadzający w błąd, OP. Masz sposób zmiany rozmiaru obrazu, co naprawdę chcesz zrobić, to utworzyć kopię oryginalnego obrazu, zmienić rozmiar kopii, a następnie zwrócić kopię. –

+0

@BrianDriscoll Wysłałem pytanie przed edycją. Edycja dodała kod do zmiany rozmiaru oryginalnego obrazu. Powiedziałbym to jako odpowiedź, ale jeszcze nie było wystarczająco długo. Ale podoba mi się nowy tytuł. Dzięki. –

+0

Czy jesteś w stanie po prostu utworzyć stałą obrazu? Czy własność prywatna może po prostu odwoływać się do oryginalnej kopii obrazu i korzystać z tej samej funkcji? – aguertin

Odpowiedz

7

może chcę wrócić kopię oryginalnego BitmapImage zamiast modyfikowania oryginalnego.

Nie ma dobrego sposobu, aby bezpośrednio skopiować BitmapImage, ale możemy ponownie użyć StorageFile kilka razy.

Jeśli tylko chcesz, aby wybrać obraz, pokazać go w międzyczasie pokazać zmianie wielkości obrazu pierwotnego, można zdać StorageFile jako parametr jak poniżej:

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; 
} 

W tym scenariuszu ty wystarczy zadzwonić do tego zadania i pokazać obraz ponownie wielkości takiego:

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

Jeśli chcesz zachować parametr BitmapImage powodu pewnych powodów (jak sourceImage może być modyfikowany bitmapy ale nie bezpośrednio ładowane z pliku), a ty chcesz o Zmień rozmiar tego nowego zdjęcia na inny, najpierw musisz zapisać obraz jako plik, a następnie otworzyć ten plik i ponownie go zmienić.

+0

To jest doskonałe, dziękuję, Grace.Czy istnieje sposób, aby uzyskać 'BitmapImage' lub' IRandomAccessStream' do 'WriteableBitmap' lub' RenderTargetBitmap' do kodowania w łańcuchu base64? Jestem w stanie zrobić "StorageFile" bezpośrednio, ale ponieważ obraz o zmienionym rozmiarze nie jest "StorageFile", muszę go przywrócić do innego typu danych do kodowania. –

+0

Skończyłem na zmianie całego procesu na użycie 'WriteableBitmap' zamiast' BitmapImage', dzięki czemu mam obraz w formacie niezbędnym do kodowania do base64. Nadal muszę utworzyć "BitmapImage" wewnątrz funkcji 'ResizedImage', aby uzyskać oryginalne wymiary, ale przynajmniej działa :) –

+0

@dubstylee, robisz to we właściwy sposób, nie mogę znaleźć sposobu na konwersję' BitmapImage' to 64base string. Aby uzyskać 'IRandomAccessStream' na' WriteableBitmap', możesz użyć 'BitmapDecoder', ale myślę, że już to wiesz. –

Powiązane problemy