2016-03-15 16 views
6

Görüntüleri program aracılığıyla yeniden boyutlandırmak için http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-save kodunu kullandım. Ancak, bu proje, Windows 10 uygulamalarında bulunmayan System.Drawing kitaplıklarını kullanır.Görüntüyü Windows'da Kopyalama ve Yeniden Boyutlandırma 10 UWP

yerine Windows.UI.Xaml.Media.Imaging den BitmapImage sınıfını kullanarak denedi, ama System.Drawing bulundu işlevselliğini sunmak için görünmüyor ..

kimse de (küçültün) görüntüleri yeniden boyutlandırmak edememek herhangi bir şans vardı Has Windows 10 mu? Uygulamam, farklı biçimlerdeki/boyutlardaki birden çok kaynaktan gelen görüntüleri işliyor olacak ve yalnızca görüntü boyutunu görüntülendiği Image'a sığdırmak yerine, yer kazanmak için gerçek görüntüleri yeniden boyutlandırmaya çalışıyorum.

DÜZENLEME

Yukarıda belirtildiği bağlantıdan kodunu değiştirmiş ve benim özel ihtiyaç için çalışır yazarlardan sahibiz. İşte burada:

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

Bu şekilde iş gibi görünüyor, ama ideal değil orijinal BitmapImage değiştirmek yerine, ben değiştirmek ve yerine dönmek için bunun yeni bir/kopyasını oluşturmak istiyoruz. Daha doğrusu orijinal değiştirerek daha özgün BitmapImage bir kopyasını döndürmek isteyebilirsiniz screenshot of resized image

+0

Yanıltıcı başlık, OP. Resmi yeniden boyutlandırmanın bir yolu var, gerçekten yapmak istediğiniz şey orijinal görüntünün bir kopyasını oluşturmak, kopyayı yeniden boyutlandırmak, sonra da kopyayı döndürmek. –

+0

@BrianDriscoll Sorgulamadan önce soruyu yayınladım. Düzenleme, orijinal görüntüyü yeniden boyutlandırmak için kod ekledi. Bunu bir cevap olarak gönderirdim, ama henüz yeterince uzun sürmedi. Ama yeni unvanı beğeniyorum. Teşekkürler. –

+0

Sadece resmin sabitini oluşturabiliyor musunuz? Veya özel bir mülkün resminin orijinal kopyasını referans olarak kullanabilir ve aynı işlevi kullanabilir misiniz? – aguertin

cevap

7

: Burada

eylem bunun bir çekim.

doğrudan BitmapImage kopyalamak için iyi bir yöntem yoktur, ama biz defalarca StorageFile yeniden kullanabilirsiniz.

sadece bir resim seçmek göstermek ve bu arada orijinal yeniden boy resmini göstermek içinde olmak istiyorsanız, böyle parametre olarak StorageFile geçirebilirsiniz: Bu senaryoda

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

sen SourceImage değiştirilmiş bitmap olabilir ama doğrudan dosyasından yüklenmemiş olabilir gibi

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

Eğer BitmapImage parametreyi korumak istiyorsanız bazı nedenlerle (: sadece bu görevi arayıp böyle yeniden boy resim göstermek gerekir) ve sen istiyorsun o bu yeni resmi bir diğerine yeniden boyutlandırırsanız, yeniden boyutlandırılan resmi ilk başta bir dosya olarak kaydetmeniz, ardından bu dosyayı açmanız ve yeniden yeniden boyutlandırmanız gerekir.

+0

Bu harika, teşekkürler Grace.Bir base64 dizesine kodlamak için 'BitmapImage' veya' IRandomAccessStream' 'WriteableBitmap' veya' RenderTargetBitmap' için bir yol var mı? "StorageFile" i doğrudan yapılandırabiliyorum, ancak yeniden boyutlandırılan görüntü bir 'StorageFile 'olmadığı için, kodlama için farklı bir veri türüne dönmem gerekiyor. –

+0

Tüm işlemi, 'BitmapImage' yerine bir "WriteableBitmap" kullanacak şekilde değiştirdim. Böylece, görüntüyü base64 kodlamak için gerekli biçimde aldım. Ben hala orijinal boyutları almak için 'ResizedImage' fonksiyonunun içinde bir' BitmapImage' yaratmak zorundayım, ama en azından çalışıyor :) –

+0

@dubstylee, bunu doğru şekilde yapıyorsun, '' ' BitmapImage '64base dize. 'IRandomAccessStream'' 'WriteableBitmap '' e almak için 'BitmapDecoder' kullanabilirsiniz, ama bence bunu zaten biliyorsunuz. –

İlgili konular