SkiaSharp: [BUG] 2.84.0-preview.4: SKCodec.Create - Value cannot be null. Parameter name: buffer

Description

Exception “Value cannot be null. Parameter name: buffer” on SKCodec.Create - stack:

SkiaSharp.SKManagedStream.OnReadManagedStream(IntPtr buffer, IntPtr size)
SkiaSharp.SKAbstractManagedStream.ReadInternal(IntPtr s, Void* context, Void* buffer, IntPtr size)
SkiaSharp.SKCodec.Create(SKStream stream, SKCodecResult& result)

This only happens on a few images - attached one.

Code

// inStream is a filestream
using var imgStream = new SKManagedStream(inStream);
using var codec = SKCodec.Create(imgStream, out SKCodecResult result);

Basic Information

Version with issue: 2.84.0-preview.4 Last known good version: 2.84.0-preview.1 IDE: Visual Studio 2019 Platform Target Frameworks: .NETFramework 4.8

Image File Sample

file-22

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 14
  • Comments: 23 (3 by maintainers)

Commits related to this issue

Most upvoted comments

I did this as a workaround - go through SKData instead of creating the codec from a stream:

using var imgStream = new SKManagedStream(inStream);
using var skData = SKData.Create(inStream);
using var codec = SKCodec.Create(skData);

rolled back to previous version 2.80.2

We are getting “Value cannot be null” error on Android while creating bitmap.

SKBitmap bitMap = SKBitmap.Decode(new MemoryStream(mediaFileBytearray));

Hi folks. Sorry it took forever to fix this - especially since it was so simple and totally my fault. I will try get a package out ASAP after this merges: https://github.com/mono/SkiaSharp/pull/2265

I had the same issue with this photo that I have zipped up that I got from google. I have another if needed as 2 of my 12 testing photos threw this error Value cannot be null. Parameter name: buffer. The fix was instead of doing this:

            Stream photoContentStream; // Stream passed in with data, just noting type here for clarity.
            using var stream = new SKManagedStream(photoContentStream, false);
            SKBitmap? bitmap = SKBitmap.Decode(stream);

Solution was this:

            using var stream = new SKManagedStream(photoContentStream, false);
            SKImage img = SKImage.FromEncodedData(stream);
            SKBitmap? bitmap = SKBitmap.FromImage(img);

Any status on the core reasoning behind this? I am using Version=“2.88.0”

14b05c00-558d-40af-93aa-608a1a3441db.zip

I’ve got the same error after upgrading SkiaSharp.NativeAssets.Linux from v2.80.2 to v2.80.3. The crash occurs in production using Docker mcr.microsoft.com/dotnet/aspnet:5.0-alpine as base image.

I do not control the calls to Skia as I’m using a library that uses it (i.e. Aspose.Words), so I cannot try to proposed workaround. 😕

at SkiaSharp.SKManagedStream.OnReadManagedStream(IntPtr buffer, IntPtr size)
at SkiaSharp.SKManagedStream.OnRead(IntPtr buffer, IntPtr size)
at SkiaSharp.SKAbstractManagedStream.ReadInternal(IntPtr s, Void* context, Void* buffer, IntPtr size)
 - Process exited with status 134
 - State changed from up to crashed

Could this be related to this PR #1510

Also ran into this on iOS and Android in Xamarin.Forms.

Doing var bitmap = SKBitmap.Decode(stream) (where stream is a MemoryStream) and I get the following exception.

System.ArgumentNullException
  Message=Value cannot be null.
Parameter name: buffer
  at SkiaSharp.SKManagedStream.OnReadManagedStream (System.IntPtr buffer, System.IntPtr size) [0x0000d] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKManagedStream.OnRead (System.IntPtr buffer, System.IntPtr size) [0x00006] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKAbstractManagedStream.ReadInternal (System.IntPtr s, System.Void* context, System.Void* buffer, System.IntPtr size) [0x00015] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at (wrapper native-to-managed) SkiaSharp.SKAbstractManagedStream.ReadInternal(intptr,void*,void*,intptr)
  at (wrapper managed-to-native) SkiaSharp.SkiaApi.sk_codec_get_pixels(intptr,SkiaSharp.SKImageInfoNative*,void*,intptr,SkiaSharp.SKCodecOptionsInternal*)
  at SkiaSharp.SKCodec.GetPixels (SkiaSharp.SKImageInfo info, System.IntPtr pixels, System.Int32 rowBytes, SkiaSharp.SKCodecOptions options) [0x0009e] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKCodec.GetPixels (SkiaSharp.SKImageInfo info, System.IntPtr pixels) [0x0000a] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKBitmap.Decode (SkiaSharp.SKCodec codec, SkiaSharp.SKImageInfo bitmapInfo) [0x0001f] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKBitmap.Decode (SkiaSharp.SKCodec codec) [0x0002f] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKBitmap.Decode (System.IO.Stream stream) [0x0001c] in <ab66cf33abf94e6f9c6728684fce9316>:0 

Doing @BenjaminMichaelis’s suggestion above worked.

var bitmap = SKBitmap.FromImage(SKImage.FromEncodedData(stream));

Thanks!!

@AndersMad, you’ve just saved my day! Thank you!