[UWP]从BitmapImage调整大小、压缩和获取base64字符串 [英] [UWP]Resize, compress and get base64 string from BitmapImage

查看:39
本文介绍了[UWP]从BitmapImage调整大小、压缩和获取base64字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的第一个主题!我正在 UWP 中重写在 Silverlight 8 (WP8) 中开发的应用程序.我在从 BitmapImage 获取 base64 编码字符串时遇到问题.我正在工作,但很多天都找不到解决方案:-( .

this is my first thread! I'm rewriting my application developed in Silverlight 8 (WP8) in UWP. I have a problem obtaining a base64 encoded string from a BitmapImage. I'm working without being able to find a solution from many days :-( .

总而言之,我需要:- 从设备库中选择图像- 将选定的图像剪切为 1 兆像素(1024* 1024)- 压缩所选图像-从压缩图像中获取base64编码的字符串

In summary i need to: -Select an image from device gallery -Cut out the selected image to 1 MegaPixel(1024* 1024) -Compress the selected image -Obtain the base64 encoded string from compressed image

我的 Silverlight 8 代码(工作):

My Silverlight 8 code (WORK):

Private Sub attachButtonHan_Click(sender As Object, e As EventArgs)
Dim photoChooserTaskAttach As Microsoft.Phone.Tasks.PhotoChooserTask
photoChooserTaskAttach = New Microsoft.Phone.Tasks.PhotoChooserTask With {.ShowCamera = True, .PixelHeight = 1024, .PixelWidth = 1024} ' how can i cut selected image from fileOpenPicker in UWP???
AddHandler photoChooserTaskAttach.Completed, AddressOf photoChooserTaskAttach_Completed
photoChooserTaskAttach.Show()
End Sub

Private Sub photoChooserTaskAttach_Completed(sender As Object, e As Microsoft.Phone.Tasks.PhotoResult)
If e.TaskResult = TaskResult.OK Then
Dim bmp As New System.Windows.Media.Imaging.BitmapImage
bmp.CreateOptions = BitmapCreateOptions.BackgroundCreation
bmp.CreateOptions = BitmapCreateOptions.DelayCreation
bmp.DecodePixelWidth = 1024
bmp.DecodePixelHeight = 1024
bmp.SetSource(e.ChosenPhoto)
Dim ms As New MemoryStream
Dim wbc As New System.Windows.Media.Imaging.WriteableBitmap(bmp)
wbc.SaveJpeg(ms, bmp.PixelWidth, bmp.PixelHeight, 0, 70) ' in UWP SaveJpeg Extension is missing...??
Dim result As Byte() = ms.ToArray()
Dim base64 As String = System.Convert.ToBase64String(result)
End If
End Sub

我的 UWP 代码(不起作用):

My UWP Code (doesn't work):

Private Async Sub ButtonSelectImgSmp_Click(sender As Object, e As RoutedEventArgs) Handles ButtonSelectImgSmp.Click
Dim openPicker As New FileOpenPicker()
openPicker.ViewMode = PickerViewMode.Thumbnail
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary
openPicker.FileTypeFilter.Add(".jpg")
openPicker.FileTypeFilter.Add(".jpeg")
openPicker.FileTypeFilter.Add(".png")
Dim file As StorageFile = Await openPicker.PickSingleFileAsync()

如何将选定的图像剪切为 1024*1024?

how can i cut selected image to 1024*1024?

If file IsNot Nothing Then
Dim streambmp = Await file.OpenAsync(Windows.Storage.FileAccessMode.Read)
Dim btmapImage = New Windows.UI.Xaml.Media.Imaging.BitmapImage()
btmapImage.DecodePixelHeight = 1024
btmapImage.DecodePixelWidth = 1024
Await btmapImage.SetSourceAsync(streambmp)
Dim ms As New MemoryStream

'  Dim wbc As New WriteableBitmap(bmp) ' Error
'  wbc.SaveJpeg(ms, bmp.PixelWidth, bmp.PixelHeight, 0, 70) 

' Error (missing savejpeg extension)   

Dim result As Byte() = ms.ToArray() 
Dim base64 As String = System.Convert.ToBase64String(result)

End If
End Sub

谢谢!!

推荐答案

在 UWP 中,您可以使用 BitmapDecoderBitmapTransform 来裁剪图像.以下是将所选图像裁剪为 100x100 的简单示例.

In UWP, you can use BitmapDecoder and BitmapTransform to crop image. Following is a simple sample about cropping selected image to 100x100.

Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)
    Dim openPicker As New FileOpenPicker()
    openPicker.ViewMode = PickerViewMode.Thumbnail
    openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary
    openPicker.FileTypeFilter.Add(".jpg")
    openPicker.FileTypeFilter.Add(".jpeg")
    openPicker.FileTypeFilter.Add(".png")
    Dim file As StorageFile = Await openPicker.PickSingleFileAsync()

    Dim stream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.Read)

    Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)
    Dim transform As BitmapTransform = New BitmapTransform()
    Dim bounds As BitmapBounds = New BitmapBounds()
    bounds.X = 0
    bounds.Y = 0
    bounds.Height = 100
    bounds.Width = 100
    transform.Bounds = bounds

    Dim pix As PixelDataProvider = Await decoder.GetPixelDataAsync(
        BitmapPixelFormat.Bgra8,
        BitmapAlphaMode.Straight,
        transform,
        ExifOrientationMode.IgnoreExifOrientation,
        ColorManagementMode.ColorManageToSRgb)
    Dim pixels As Byte() = pix.DetachPixelData()

    Dim cropBmp As WriteableBitmap = New WriteableBitmap(100, 100)
    Dim pixStream As Stream = cropBmp.PixelBuffer.AsStream()
    pixStream.Write(pixels, 0, 100 * 100 * 4)

    'Image control used to display the image
    img.Source = cropBmp

    Dim base64 As String = Convert.ToBase64String(pixels)
End Sub

PixelDataProvider.DetachPixelData 方法返回内部存储的像素数据.您可以使用它来获取 base64 字符串.

PixelDataProvider.DetachPixelData method returns the internally-stored pixel data. You can use it to get base64 string.

这里有一个官方的如何在 Windows 应用商店应用中裁剪位图您可以参考 MSDN 上的示例.

And here is a official How to crop bitmap in a Windows Store app sample on MSDN you can refer.

这篇关于[UWP]从BitmapImage调整大小、压缩和获取base64字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆