Невозможно преобразовать растровое изображение в байт [] - PullRequest
0 голосов
/ 07 сентября 2018

Итак, я делаю приложение Xamarin.Forms. У меня есть StackLayout, из которого я делаю снимок (только элемент, а не весь экран.)

Это интерфейс:

public interface IViewSnapShot
{
    Task<byte[]> CaptureAsync(Xamarin.Forms.View view);
}

это событие:

private async Task SavePic_ClickedAsync(object sender, EventArgs e)
    {
        var imageByte = await DependencyService.Get<IViewSnapShot>().CaptureAsync(BlueprintSnapshot);
    }

и это зависит от платформы Android:

public class MakeViewSnapshot : IViewSnapShot
{
    Task<byte[]> IViewSnapShot.CaptureAsync(Xamarin.Forms.View view)
    {
        var nativeView = view.GetRenderer().View;
        var wasDrawingCacheEnabled = nativeView.DrawingCacheEnabled;
        nativeView.DrawingCacheEnabled = true;
        nativeView.BuildDrawingCache(false);
        Bitmap bitmap = nativeView.GetDrawingCache(false);
        // TODO: Save bitmap and return filepath
        nativeView.DrawingCacheEnabled = wasDrawingCacheEnabled;

        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

        return bitmapData;
    }
}

Проблема bitmapData дает ошибку

Невозможно неявно преобразовать тип 'byte []' в 'System.Threading.Tasks.Task'

У меня есть поиск в Интернете, и в каждом сообщении говорится, что это способ преобразования растрового изображения в массив байтов []. Есть идеи, как исправить эту ошибку?

Позже я захочу загрузить массив byte [] в web api.

1 Ответ

0 голосов
/ 07 сентября 2018

Вместо возврата byte[] вы можете использовать Task.FromResult () , чтобы обернуть результат в Task:

return Task.FromResult(bitmapData);

Ваш код может выглядеть так:

public class MakeViewSnapshot : IViewSnapShot
{
    Task<byte[]> IViewSnapShot.CaptureAsync(Xamarin.Forms.View view)
    {
        var nativeView = view.GetRenderer().View;
        var wasDrawingCacheEnabled = nativeView.DrawingCacheEnabled;
        nativeView.DrawingCacheEnabled = true;
        nativeView.BuildDrawingCache(false);
        Bitmap bitmap = nativeView.GetDrawingCache(false);
        // TODO: Save bitmap and return filepath
        nativeView.DrawingCacheEnabled = wasDrawingCacheEnabled;

        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

        return Task.FromResult(bitmapData);
    }
}

А потом, когда вы хотите получить byte[], возвращаемый CaptureAsync(), вам просто нужно позвонить:

byte[] result = CaptureAsync(<Your_parameters>).Result;
...