在 UWP 中从 HTTP GET 获取 SoftwareBitmap
Get a SoftwareBitmap from HTTP GET in UWP
我正在处理一个需要使用 OCR 处理文件的项目,
而且由于不允许我直接在 UWP 中访问文件,我只有两个选择:
文件选择器(不受欢迎),或从 Http 服务器获取文件,
我能够使用文件选择器,这是我的实现:
SoftwareBitmap softwareBitmap;
FileOpenPicker fileOpenPicker = new FileOpenPicker();
fileOpenPicker.FileTypeFilter.Add(".jpg");
fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;
var inputFile = await fileOpenPicker.PickSingleFileAsync();
using (IRandomAccessStream stream = await inputFile.OpenAsync(FileAccessMode.Read))
{
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
softwareBitmap = await decoder.GetSoftwareBitmapAsync();
}
OcrEngine ocrEngine = OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("fr-FR"));
OcrResult ocrResults = await ocrEngine.RecognizeAsync(softwareBitmap);
OcrLine ocrResult = ocrResults.Lines[0];
string text = ocrResult.Text;
现在我正在尝试从 HTTP GET 请求中获取文件,但我不知道如何以 SoftwareBitmap
格式(OcrEngine
接受)
从这个 link 中,我找到了这个有用的代码示例,我用它获得了 BitmapImage
格式的文件
private async void Populate()
{
string QRServiceAPI = "https://api.qrserver.com/v1/create-qr-code/?data={0}&size={1}x{2}";
string q = string.Format(QRServiceAPI, "http://solatys.com", 150, 150);
using (var d = new Downloader())
{
var feed = await d.GetDataFeed(q);
feed.Seek(0, SeekOrigin.Begin);
BitmapImage bmp = new BitmapImage();
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
{
writer.WriteBytes((byte[])feed.ToArray());
writer.StoreAsync().GetResults();
}
var image = new BitmapImage();
image.SetSource(ms);
Image1.Source = image;
}
}
}
我该怎么做才能将此 BitmapImage
转换为 SoftwareBitmap
?
或者我怎样才能直接以 SoftwareBitmap
的形式得到它?
您可以通过使用 HttpClient 获取图像并将内容流转换为 IRandomAccessStream 来完成此操作
HttpClient client = new HttpClient();
var response = await client.GetAsync("http://my.image");
var stream = await response.Content.ReadAsStreamAsync();
IRandomAccessStream randomAccessStream = stream.AsRandomAccessStream();
从那里开始,它与您已有的一样
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream);
softwareBitmap = await decoder.GetSoftwareBitmapAsync();
请注意 AsRandomAccessStream
是 System.IO
命名空间中的扩展方法。
我正在处理一个需要使用 OCR 处理文件的项目,
而且由于不允许我直接在 UWP 中访问文件,我只有两个选择:
文件选择器(不受欢迎),或从 Http 服务器获取文件,
我能够使用文件选择器,这是我的实现:
SoftwareBitmap softwareBitmap;
FileOpenPicker fileOpenPicker = new FileOpenPicker();
fileOpenPicker.FileTypeFilter.Add(".jpg");
fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;
var inputFile = await fileOpenPicker.PickSingleFileAsync();
using (IRandomAccessStream stream = await inputFile.OpenAsync(FileAccessMode.Read))
{
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
softwareBitmap = await decoder.GetSoftwareBitmapAsync();
}
OcrEngine ocrEngine = OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("fr-FR"));
OcrResult ocrResults = await ocrEngine.RecognizeAsync(softwareBitmap);
OcrLine ocrResult = ocrResults.Lines[0];
string text = ocrResult.Text;
现在我正在尝试从 HTTP GET 请求中获取文件,但我不知道如何以 SoftwareBitmap
格式(OcrEngine
接受)
从这个 link 中,我找到了这个有用的代码示例,我用它获得了 BitmapImage
格式的文件
private async void Populate()
{
string QRServiceAPI = "https://api.qrserver.com/v1/create-qr-code/?data={0}&size={1}x{2}";
string q = string.Format(QRServiceAPI, "http://solatys.com", 150, 150);
using (var d = new Downloader())
{
var feed = await d.GetDataFeed(q);
feed.Seek(0, SeekOrigin.Begin);
BitmapImage bmp = new BitmapImage();
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
{
writer.WriteBytes((byte[])feed.ToArray());
writer.StoreAsync().GetResults();
}
var image = new BitmapImage();
image.SetSource(ms);
Image1.Source = image;
}
}
}
我该怎么做才能将此 BitmapImage
转换为 SoftwareBitmap
?
或者我怎样才能直接以 SoftwareBitmap
的形式得到它?
您可以通过使用 HttpClient 获取图像并将内容流转换为 IRandomAccessStream 来完成此操作
HttpClient client = new HttpClient();
var response = await client.GetAsync("http://my.image");
var stream = await response.Content.ReadAsStreamAsync();
IRandomAccessStream randomAccessStream = stream.AsRandomAccessStream();
从那里开始,它与您已有的一样
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream);
softwareBitmap = await decoder.GetSoftwareBitmapAsync();
请注意 AsRandomAccessStream
是 System.IO
命名空间中的扩展方法。