Невозможно использовать какую-либо библиотеку изображений в проекте функции AWS Lambda в .NET Core

Я разрабатываю функцию Aws S3 Lambda в ядре .NET. Сейчас я пытаюсь изменить размер изображения и сохранить его как новый файл, когда файл изображения загружается в корзину s3. Для изменения размера изображений в ядре .NET я попытался использовать все упомянутые параметры в этой ссылке. Все параметры работают локально на моем ноутбуке с Windows. Но когда я устанавливаю какой-либо из пакетов или файлов DLL в свой проект и использую его в функции AWS Lambda, я получаю сообщение об ошибке. Для всех библиотек. Похоже, что AWS lambda использует сервер Linux, и для библиотек могут потребоваться дополнительные настройки.

Например, когда я использую CoreCompat.System.Drawing в коде и создаю такое растровое изображение.

var resized = new Bitmap(100, 100);

Я получил эту ошибку, когда тестировал ее на консоли AWS.

{
  "errorType": "AggregateException",
  "errorMessage": "One or more errors occurred. (The type initializer for 'System.Drawing.GDIPlus' threw an exception.)",
  "stackTrace": [
    "at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)",
    "at lambda_method(Closure , Stream , Stream , LambdaContextInternal )"
  ],
  "cause": {
    "errorType": "TypeInitializationException",
    "errorMessage": "The type initializer for 'System.Drawing.GDIPlus' threw an exception.",
    "stackTrace": [
      "at System.Drawing.GDIPlus.GdipCreateBitmapFromScan0(Int32 width, Int32 height, Int32 stride, PixelFormat format, IntPtr scan0, IntPtr& bmp)",
      "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)",
      "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)",
      "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 117"
    ],
    "cause": {
      "errorType": "DllNotFoundException",
      "errorMessage": "Unable to load DLL 'gdiplus': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
      "stackTrace": [
        "at System.Drawing.GDIPlus.GdiplusStartup(UInt64& token, GdiplusStartupInput& input, GdiplusStartupOutput& output)",
        "at System.Drawing.GDIPlus..cctor()"
      ]
    }
  },
  "causes": [
    {
      "errorType": "TypeInitializationException",
      "errorMessage": "The type initializer for 'System.Drawing.GDIPlus' threw an exception.",
      "stackTrace": [
        "at System.Drawing.GDIPlus.GdipCreateBitmapFromScan0(Int32 width, Int32 height, Int32 stride, PixelFormat format, IntPtr scan0, IntPtr& bmp)",
        "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)",
        "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)",
        "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 117"
      ],
      "cause": {
        "errorType": "DllNotFoundException",
        "errorMessage": "Unable to load DLL 'gdiplus': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
        "stackTrace": [
          "at System.Drawing.GDIPlus.GdiplusStartup(UInt64& token, GdiplusStartupInput& input, GdiplusStartupOutput& output)",
          "at System.Drawing.GDIPlus..cctor()"
        ]
      }
    }
  ]
}

Я знаю, что CoreCompat.System.Drawing имеет кроссплатформенную проблему. Итак, я попытался использовать SkiaSharp, совместимый с кроссплатформенностью.

Однажды я вызываю эту строку кода.

using(var inputStream = new SKManagedStream(responseStream))
                  {

                  }

Я получил эту ошибку.

{
  "errorType": "AggregateException",
  "errorMessage": "One or more errors occurred. (The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception.)",
  "stackTrace": [
    "at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)",
    "at lambda_method(Closure , Stream , Stream , LambdaContextInternal )"
  ],
  "cause": {
    "errorType": "TypeInitializationException",
    "errorMessage": "The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception.",
    "stackTrace": [
      "at SkiaSharp.SKAbstractManagedStream..ctor(Boolean owns)",
      "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream, Boolean owns)",
      "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream)",
      "at SkiaSharp.SKManagedStream..ctor(Stream managedStream)",
      "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 113"
    ],
    "cause": {
      "errorType": "DllNotFoundException",
      "errorMessage": "Unable to load DLL 'libSkiaSharp': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
      "stackTrace": [
        "at SkiaSharp.SkiaApi.sk_managedstream_set_delegates(IntPtr pRead, IntPtr pPeek, IntPtr pIsAtEnd, IntPtr pHasPosition, IntPtr pHasLength, IntPtr pRewind, IntPtr pGetPosition, IntPtr pSeek, IntPtr pMove, IntPtr pGetLength, IntPtr pCreateNew, IntPtr pDestroy)",
        "at SkiaSharp.SKAbstractManagedStream..cctor()"
      ]
    }
  },
  "causes": [
    {
      "errorType": "TypeInitializationException",
      "errorMessage": "The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception.",
      "stackTrace": [
        "at SkiaSharp.SKAbstractManagedStream..ctor(Boolean owns)",
        "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream, Boolean owns)",
        "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream)",
        "at SkiaSharp.SKManagedStream..ctor(Stream managedStream)",
        "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 113"
      ],
      "cause": {
        "errorType": "DllNotFoundException",
        "errorMessage": "Unable to load DLL 'libSkiaSharp': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
        "stackTrace": [
          "at SkiaSharp.SkiaApi.sk_managedstream_set_delegates(IntPtr pRead, IntPtr pPeek, IntPtr pIsAtEnd, IntPtr pHasPosition, IntPtr pHasLength, IntPtr pRewind, IntPtr pGetPosition, IntPtr pSeek, IntPtr pMove, IntPtr pGetLength, IntPtr pCreateNew, IntPtr pDestroy)",
          "at SkiaSharp.SKAbstractManagedStream..cctor()"
        ]
      }
    }
  ]
}

Я перепробовал все библиотеки, указанные в ссылке. Все библиотеки работают с ядром .NET локально на моем ноутбуке, когда я создаю новое приложение проекта (консоль) и тестирую его. Но все библиотеки не работают, когда я использую их в проекте функции AWS Lambda, потому что все библиотеки выдают соответствующую ошибку, когда я тестирую ее на консоли AWS. Как изменить размер изображения в функции AWS Lambda в .NET Core?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 102
1

Ответы 1

.NET Core поставляется с System.Drawing.Common, кроссплатформенной реализацией System.Drawing.

Он использует libgdiplus, и вам нужно убедиться, что вы установили libgdiplus на сервере, на котором будет работать ваш код. Проект libgdiplus находится по адресу github.com/mono/libgdiplus и поставляется с большинством дистрибутивов Linux.

То же самое касается SkiaSharp и его собственного аналога.

Я мало знаю о функциях Amazon Lambda, но если у вас нет контроля над тем, какие пакеты установлены на сервере, на котором выполняется ваш код, вы также можете попробовать полностью управляемую библиотеку рисования, такую ​​как ImageSharp.

Другие вопросы по теме