SkiaSharp icon indicating copy to clipboard operation
SkiaSharp copied to clipboard

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

Open AndersMad opened this issue 3 years ago • 22 comments

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

AndersMad avatar Nov 11 '20 14:11 AndersMad

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

AndersMad avatar Jan 08 '21 10:01 AndersMad

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

intenzive avatar Jul 15 '21 15:07 intenzive

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

dstj avatar Jul 16 '21 13:07 dstj

This null exception also occurs in v2.80.3 on iOS when calling SKBitmap.Decode( stream ).

mlancione avatar Jul 16 '21 19:07 mlancione

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

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

glintpursuit avatar Jul 24 '21 12:07 glintpursuit

Same error even from SKimage

SKBitmap bitMap = SKBitmap.FromImage(SKImage.FromEncodedData(new MemoryStream(mediaFileBytearray)));

glintpursuit avatar Jul 24 '21 12:07 glintpursuit

rolled back to previous version 2.80.2

glintpursuit avatar Jul 26 '21 07:07 glintpursuit

Is it possible to attach an image in a zip file? GitHub does some processing and the image is modified.

Also, could you give the latest 2.88 preview a try.

mattleibow avatar Jul 29 '21 11:07 mattleibow

Looks like these are related.

Duplicate of #1621

mattleibow avatar Jul 29 '21 11:07 mattleibow

Using version 2.88-preview.120 did not solve this issue for me on android. It is working by rolling back to 2.80.2, though.

TopperDEL avatar Aug 11 '21 20:08 TopperDEL

sry @mattleibow - I didn't see that zip request, so here's a beautiful girl with data problems for you :) beautiful-girl-1551.zip

AndersMad avatar Aug 12 '21 12:08 AndersMad

Also got this error after updating to 2.80.3. It seems to happen with all photos taken with Samsung Galaxy 8 phone

ossipoff avatar Sep 23 '21 14:09 ossipoff

I can confirm. Skisharp is not working with images taken from my Samsung S8 (Other devices have no issue android or iOS)

System.ArgumentNullException: 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_new_from_stream(intptr,SkiaSharp.SKCodecResult*)
  at SkiaSharp.SKCodec.Create (SkiaSharp.SKStream stream, SkiaSharp.SKCodecResult& result) [0x0003b] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKCodec.Create (System.IO.Stream stream, SkiaSharp.SKCodecResult& result) [0x00006] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKCodec.Create (System.IO.Stream stream) [0x00000] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at SkiaSharp.SKBitmap.Decode (System.IO.Stream stream) [0x0000e] in <ab66cf33abf94e6f9c6728684fce9316>:0 
  at <mypath>.BitmapExtensions.LoadBitmapFromFile (System.Type type, System.String filePath) [0x00018] in <mypath>\BitmapExtensions.cs:35 
  at <mypath>.LoadBitmap () [0x0004b] in <mypath>.someViewModel.cs:642 

npostma avatar Oct 08 '21 13:10 npostma

This bug still persists in version 2.88 prev .155 any updates or workarounds?

aloksharma1 avatar Nov 24 '21 10:11 aloksharma1

For me, the workaround @AndersMad said worked. But my images are now turned 90 degrees.

hosseinitabar avatar Jan 06 '22 15:01 hosseinitabar

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

Since update from 2.82 to 2.83 have have the same problems with samsung devices. But this workaround worked for me also. Thanks a lot :-)

DiebBlue avatar Feb 07 '22 19:02 DiebBlue

thanks for that solution @AndersMad - I ran into this same error with certain images via SKBitmap.Decode(stream):

Stream? stream = /*......*/;
var bitmap = SKBitmap.Decode(stream); // NOPE, error!
var image = SKImage.FromBitmap(bitmap);
var outputData = image.Encode(SKEncodedImageFormat.Png, 100);

changed to this to fix:

Stream? stream = /*......*/;
using var inputStream = new SKManagedStream(stream);
using var inputData = SKData.Create(inputStream);
var bitmap = SKBitmap.Decode(inputData); // now it works
var image = SKImage.FromBitmap(bitmap);
var outputData = image.Encode(SKEncodedImageFormat.Png, 100);

replaysMike avatar Mar 18 '22 20:03 replaysMike

Any changes on this? Still happening on latest preview

theolivenbaum avatar Apr 05 '22 08:04 theolivenbaum

Any changes on this? Still happening on latest preview

Yes, still has issue in 2.88.0-preview.232

codeBestard avatar Apr 14 '22 03:04 codeBestard

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

BenjaminMichaelis avatar May 26 '22 17:05 BenjaminMichaelis

For me, the workaround @AndersMad said worked. But my images are now turned 90 degrees.

Were you able to fix the 90 deg problem ? The problem only occurs if you process load an image taken by the device camera. Orientation information is not processed I guess

shehrozeee avatar Jun 09 '22 06:06 shehrozeee

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!!

jamers99 avatar Jul 15 '22 18:07 jamers99

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

mattleibow avatar Sep 29 '22 04:09 mattleibow