{"id":20094776,"url":"https://github.com/turborium/bitmappixels","last_synced_at":"2026-02-12T07:31:25.839Z","repository":{"id":137973965,"uuid":"437454592","full_name":"turborium/BitmapPixels","owner":"turborium","description":"BitmapPixels.pas  - Lazarus and Delphi module for direct access to pixels at TBitmap","archived":false,"fork":false,"pushed_at":"2023-04-28T22:31:53.000Z","size":566,"stargazers_count":22,"open_issues_count":0,"forks_count":7,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-09-09T17:58:04.188Z","etag":null,"topics":["delphi","delphi-library","graphics-programming","mozol","pascal-language","pascal-programming"],"latest_commit_sha":null,"homepage":"","language":"Pascal","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/turborium.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-12T04:45:00.000Z","updated_at":"2025-01-26T11:21:24.000Z","dependencies_parsed_at":"2023-07-16T14:16:55.047Z","dependency_job_id":null,"html_url":"https://github.com/turborium/BitmapPixels","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/turborium/BitmapPixels","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turborium%2FBitmapPixels","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turborium%2FBitmapPixels/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turborium%2FBitmapPixels/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turborium%2FBitmapPixels/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/turborium","download_url":"https://codeload.github.com/turborium/BitmapPixels/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turborium%2FBitmapPixels/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29361448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T01:03:07.613Z","status":"online","status_checked_at":"2026-02-12T02:00:06.911Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["delphi","delphi-library","graphics-programming","mozol","pascal-language","pascal-programming"],"created_at":"2024-11-13T16:52:18.287Z","updated_at":"2026-02-12T07:31:25.824Z","avatar_url":"https://github.com/turborium.png","language":"Pascal","readme":"# BitmapPixels\n## [ENG] \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg\" height=\"11px\"/\u003e\n### BitmapPixels.pas  - Lazarus and Delphi module for direct access to pixels at TBitmap\n#### Worked on Windows(WinApi), Linux(GTK2, Qt5), OSX(Cocoa)\n\nQuite a popular question is how to get quick access to **TBitmap** pixels?  \nIt is easy to do in **Delphi**, with **Scanline[]** property, due to the limited number of pixel formats, but rather difficult in **Lazarus**.   \nFor example: https://wiki.freepascal.org/Fast_direct_pixel_access  \n\nI propose a small, single file, module **\"BitmapPixels.pas\"** that simplify work to just calling **TBitmapData.Map()** and **TBitmapData.Unmap()**.  \nYou get an array of **$AARRGGBB** pixels in the **Data** property, and abilty set and get color of pixels using **SetPixel()/GetPixel()**.  \n\n```delphi\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;// for easy access to the channels \nbegin\n  // Reading the colors of the image into map \"Data\", width mode \"ReadWrite\", in the \"False\" alpha channel mode.\n  // The alpha channel will be set to 0 on every element of the array. ($00RRGGBB, $00RRGGBB, ...) \n  Data.Map(Bitmap, TAccessMode.ReadWrite, False);\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        // Read color at (X, Y) to Pixel record\n        Pixel := Data.GetPixel(X, Y);\n        // some changes of Pixel\n        Pixel.R := (Pixel.R + Pixel.G + Pixel.B) div 3;\n        Pixel.G := Pixel.R;\n        Pixel.B := Pixel.R;\n        // ...\n        // Write Pixel record to (X, Y) in map\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    // Writing the map to the image.\n    // Since we have abandoned Alpha, the pixel format will be set to pf24bit.\n    Data.Unmap();\n  end;\nend;\n```\n\n**Key Features:**\n- cross-platform \n- supports all TBitmap pixel formats for reading \n- fast processing of popular formats in Windows/GTK/Qt/OSX \n- can map any image as having an alpha channel or not (24bit/32bit)\n\n\n#### Example 1 - Invert colors (read and write)\n![example1.png](examples/example1.png)\n```delphi\nprocedure InvertColors(const Bitmap: TBitmap);\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Data.Map(Bitmap, TAccessMode.ReadWrite, False);// RGB access\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel := Data.GetPixel(X, Y);\n        Pixel.R := 255 - Pixel.R;\n        Pixel.G := 255 - Pixel.G;\n        Pixel.B := 255 - Pixel.B;\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend; \n```\n#### Example 2 - Half bitmap transparency (read and write, alpha)\n![example2.png](examples/example2.png)\n```delphi\nprocedure HalfAlpha(const Bitmap: TBitmap);\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Data.Map(Bitmap, TAccessMode.ReadWrite, True);// ARGB access\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel := Data.GetPixel(X, Y);\n        Pixel.A := Pixel.A div 2;\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend; \n```\n#### Example 3 - Make a plasm effect on bitmap (write only)\n![example3.png](examples/example3.png)\n```delphi\nfunction MakePlasm(): TBitmap;\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Result := TBitmap.Create();\n  Result.SetSize(300, 300);\n\n  Data.Map(Result, TAccessMode.Write, False);\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel.R := Byte(Trunc(\n          100 + 100 * (Sin(X * Cos(Y * 0.049) * 0.01) + Cos(X * 0.0123 - Y * 0.09))));\n        Pixel.G := 0;\n        Pixel.B := Byte(Trunc(\n          Pixel.R + 100 * (Sin(X * Cos(X * 0.039) * 0.022) + Sin(X * 0.01 - Y * 0.029))));\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend;\n```\n#### Example 4 - Mix two bitmaps to one bitmap (read only, write only)\n![example4.png](examples/example4.png)\n```delphi\nfunction Mix(const A, B: TBitmap): TBitmap;\n  function Min(A, B: Integer): Integer;\n  begin\n    if A \u003c B then Exit(A) else Exit(B);\n  end;\nvar\n  DataA, DataB, DataResult: TBitmapData;\n  X, Y: Integer;\n  PixelA, PixelB, PixelResult: TPixelRec;\nbegin\n  Result := TBitmap.Create();\n  Result.SetSize(Min(A.Width, B.Width), Min(A.Height, B.Height));\n  // this needed for correct Unmap() on exception\n  DataA.Init();\n  DataB.Init();\n  DataResult.Init();\n  try\n    DataA.Map(A, TAccessMode.Read, False);\n    DataB.Map(B, TAccessMode.Read, False);\n    DataResult.Map(Result, TAccessMode.Write, False);\n    for Y := 0 to DataResult.Height - 1 do\n    begin\n      for X := 0 to DataResult.Width - 1 do\n      begin\n        PixelA := DataA.Pixels[X, Y];\n        PixelB := DataB.Pixels[X, Y];\n        PixelResult.R := (PixelA.R + PixelB.R) div 2;\n        PixelResult.G := (PixelA.G + PixelB.G) div 2;\n        PixelResult.B := (PixelA.B + PixelB.B) div 2;\n        DataResult[X, Y] := PixelResult;\n      end;\n    end;\n  finally\n    DataA.Unmap();\n    DataB.Unmap();\n    DataResult.Unmap();\n  end;\nend;\n```\n\n---\n## [RUS] \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/White-blue-white_flag.svg/375px-White-blue-white_flag.svg.png\" height=\"11px\"/\u003e\n### BitmapPixels.pas  - Модуль для Lazarus и Delphi дающий прямой доступ к пикселам TBitmap.\n#### Работает на Windows(WinApi), Linux(GTK2, Qt5), OSX(Cocoa)\n\nЕсть довольно популярный, в сообществе Lazarus разработчиков, вопрос: Как получить быстрый доступ к пикселам **TBitmap**?  \nЭто легко сделать в **Delphi** благодаря свойству **Scanline[]** из-за довольно ограниченного количества возможных форматов пикселей, но довольно сложно в **Lazarus**.  \nПримеры сложностей, которые могут возникнуть: https://wiki.freepascal.org/Fast_direct_pixel_access. \n\nЯ предлагаю небольшой, в виде одного файла, модуль **\"BitmapPixels.pas\"**, который упрощает работу до простого вызова **TBitmapData.Map()** и **TBitmapData.Unmap()**.  \nВы получаете массив пикселей в формате **$AARRGGBB** в свойстве **Data**, а также возможность установить и получить цвет пикселей с помощью **SetPixel()/GetPixel()**. \n\n```delphi\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;// for easy access to the channels \nbegin\n  // Reading the colors of the image into map \"Data\", width mode \"ReadWrite\", in the \"False\" alpha channel mode.\n  // The alpha channel will be set to 0 on every element of the array. ($00RRGGBB, $00RRGGBB, ...) \n  Data.Map(Bitmap, TAccessMode.ReadWrite, False);\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        // Read color at (X, Y) to Pixel record\n        Pixel := Data.GetPixel(X, Y);\n        // some changes of Pixel\n        Pixel.R := (Pixel.R + Pixel.G + Pixel.B) div 3;\n        Pixel.G := Pixel.R;\n        Pixel.B := Pixel.R;\n        // ...\n        // Write Pixel record to (X, Y) in map\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    // Writing the map to the image.\n    // Since we have abandoned Alpha, the pixel format will be set to pf24bit.\n    Data.Unmap();\n  end;\nend;\n```\n\n**Основные фичи:**\n- кроссплатформенность\n- поддерживает все форматы пикселей TBitmap для чтения\n- ускоренная обработка популярных форматов в Windows/GTK/Qt /OSX\n- можно обработать любое изображение, как имеющее альфа-канал, так и нет (24бит/32бит) \n\n\n#### Example 1 - Инвертирование цвета (read and write)\n![example1.png](examples/example1.png)\n```delphi\nprocedure InvertColors(const Bitmap: TBitmap);\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Data.Map(Bitmap, TAccessMode.ReadWrite, False);// RGB access\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel := Data.GetPixel(X, Y);\n        Pixel.R := 255 - Pixel.R;\n        Pixel.G := 255 - Pixel.G;\n        Pixel.B := 255 - Pixel.B;\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend; \n```\n#### Example 2 - Создание полупрозрачного изображения (read and write, alpha)\n![example2.png](examples/example2.png)\n```delphi\nprocedure HalfAlpha(const Bitmap: TBitmap);\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Data.Map(Bitmap, TAccessMode.ReadWrite, True);// ARGB access\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel := Data.GetPixel(X, Y);\n        Pixel.A := Pixel.A div 2;\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend; \n```\n#### Example 3 - Создание эффекта плазмы (write only)\n![example3.png](examples/example3.png)\n```delphi\nfunction MakePlasm(): TBitmap;\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Result := TBitmap.Create();\n  Result.SetSize(300, 300);\n\n  Data.Map(Result, TAccessMode.Write, False);\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel.R := Byte(Trunc(\n          100 + 100 * (Sin(X * Cos(Y * 0.049) * 0.01) + Cos(X * 0.0123 - Y * 0.09))));\n        Pixel.G := 0;\n        Pixel.B := Byte(Trunc(\n          Pixel.R + 100 * (Sin(X * Cos(X * 0.039) * 0.022) + Sin(X * 0.01 - Y * 0.029))));\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend;\n```\n#### Example 4 - Смешивание двух изображений (read only, write only)\n![example4.png](examples/example4.png)\n```delphi\nfunction Mix(const A, B: TBitmap): TBitmap;\n  function Min(A, B: Integer): Integer;\n  begin\n    if A \u003c B then Exit(A) else Exit(B);\n  end;\nvar\n  DataA, DataB, DataResult: TBitmapData;\n  X, Y: Integer;\n  PixelA, PixelB, PixelResult: TPixelRec;\nbegin\n  Result := TBitmap.Create();\n  Result.SetSize(Min(A.Width, B.Width), Min(A.Height, B.Height));\n  // this needed for correct Unmap() on exception\n  DataA.Init();\n  DataB.Init();\n  DataResult.Init();\n  try\n    DataA.Map(A, TAccessMode.Read, False);\n    DataB.Map(B, TAccessMode.Read, False);\n    DataResult.Map(Result, TAccessMode.Write, False);\n    for Y := 0 to DataResult.Height - 1 do\n    begin\n      for X := 0 to DataResult.Width - 1 do\n      begin\n        PixelA := DataA.Pixels[X, Y];\n        PixelB := DataB.Pixels[X, Y];\n        PixelResult.R := (PixelA.R + PixelB.R) div 2;\n        PixelResult.G := (PixelA.G + PixelB.G) div 2;\n        PixelResult.B := (PixelA.B + PixelB.B) div 2;\n        DataResult[X, Y] := PixelResult;\n      end;\n    end;\n  finally\n    DataA.Unmap();\n    DataB.Unmap();\n    DataResult.Unmap();\n  end;\nend;\n```\n---\n## [UA] \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/4/49/Flag_of_Ukraine.svg\" height=\"11px\"/\u003e\n### BitmapPixels.pas  - Модуль для Lazarus і Delphi, що дає прямий доступ до пікселів TBitmap.\n#### Працює на Windows(WinApi), Linux(GTK2, Qt5), OSX(Cocoa)\n\nЄ досить популярне, у спільноті Lazarus розробників, питання: Як отримати швидкий доступ до пікселів TBitmap?  \nЦе легко зробити в **Delphi** завдяки властивості **Scanline[]** через досить обмежену кількість можливих форматів пікселів, але досить складно в **Lazarus**.  \nПриклади складнощів, які можуть виникнути: https://wiki.freepascal.org/Fast_direct_pixel_access. \n\nЯ пропоную невеликий, у вигляді одного файлу, модуль **\"BitmapPixels.pas \"**, який спрощує роботу до простого виклику **TBitmapData.Map()** і **TBitmapData.Unmap()**.  \nВи отримуєте масив пікселів у форматі **$AARRGGBB** у властивості **Data**, а також можливість встановити та отримати колір пікселів за допомогою **SetPixel()/GetPixel()**. \n\n```delphi\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;// for easy access to the channels \nbegin\n  // Reading the colors of the image into map \"Data\", width mode \"ReadWrite\", in the \"False\" alpha channel mode.\n  // The alpha channel will be set to 0 on every element of the array. ($00RRGGBB, $00RRGGBB, ...) \n  Data.Map(Bitmap, TAccessMode.ReadWrite, False);\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        // Read color at (X, Y) to Pixel record\n        Pixel := Data.GetPixel(X, Y);\n        // some changes of Pixel\n        Pixel.R := (Pixel.R + Pixel.G + Pixel.B) div 3;\n        Pixel.G := Pixel.R;\n        Pixel.B := Pixel.R;\n        // ...\n        // Write Pixel record to (X, Y) in map\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    // Writing the map to the image.\n    // Since we have abandoned Alpha, the pixel format will be set to pf24bit.\n    Data.Unmap();\n  end;\nend;\n```\n\n**Основні фічі:**\n- кросплатформеність\n- підтримує всі формати пікселів TBitmap для читання\n- прискорена обробка популярних форматів у Windows/GTK/Qt /OSX\n- можна обробити будь-яке зображення, як таке, що має альфа-канал, так і ні (24біт/32біт) \n\n\n#### Example 1 - Інвертування кольору (read and write)\n![example1.png](examples/example1.png)\n```delphi\nprocedure InvertColors(const Bitmap: TBitmap);\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Data.Map(Bitmap, TAccessMode.ReadWrite, False);// RGB access\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel := Data.GetPixel(X, Y);\n        Pixel.R := 255 - Pixel.R;\n        Pixel.G := 255 - Pixel.G;\n        Pixel.B := 255 - Pixel.B;\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend; \n```\n#### Example 2 - Створення напівпрозорого зображення (read and write, alpha)\n![example2.png](examples/example2.png)\n```delphi\nprocedure HalfAlpha(const Bitmap: TBitmap);\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Data.Map(Bitmap, TAccessMode.ReadWrite, True);// ARGB access\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel := Data.GetPixel(X, Y);\n        Pixel.A := Pixel.A div 2;\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend; \n```\n#### Example 3 - Створення ефекту плазми (write only)\n![example3.png](examples/example3.png)\n```delphi\nfunction MakePlasm(): TBitmap;\nvar\n  Data: TBitmapData;\n  X, Y: Integer;\n  Pixel: TPixelRec;\nbegin\n  Result := TBitmap.Create();\n  Result.SetSize(300, 300);\n\n  Data.Map(Result, TAccessMode.Write, False);\n  try\n    for Y := 0 to Data.Height - 1 do\n    begin\n      for X := 0 to Data.Width - 1 do\n      begin\n        Pixel.R := Byte(Trunc(\n          100 + 100 * (Sin(X * Cos(Y * 0.049) * 0.01) + Cos(X * 0.0123 - Y * 0.09))));\n        Pixel.G := 0;\n        Pixel.B := Byte(Trunc(\n          Pixel.R + 100 * (Sin(X * Cos(X * 0.039) * 0.022) + Sin(X * 0.01 - Y * 0.029))));\n        Data.SetPixel(X, Y, Pixel);\n      end;\n    end;\n  finally\n    Data.Unmap();\n  end;\nend;\n```\n#### Example 4 - Змішування двох зображень (read only, write only)\n![example4.png](examples/example4.png)\n```delphi\nfunction Mix(const A, B: TBitmap): TBitmap;\n  function Min(A, B: Integer): Integer;\n  begin\n    if A \u003c B then Exit(A) else Exit(B);\n  end;\nvar\n  DataA, DataB, DataResult: TBitmapData;\n  X, Y: Integer;\n  PixelA, PixelB, PixelResult: TPixelRec;\nbegin\n  Result := TBitmap.Create();\n  Result.SetSize(Min(A.Width, B.Width), Min(A.Height, B.Height));\n  // this needed for correct Unmap() on exception\n  DataA.Init();\n  DataB.Init();\n  DataResult.Init();\n  try\n    DataA.Map(A, TAccessMode.Read, False);\n    DataB.Map(B, TAccessMode.Read, False);\n    DataResult.Map(Result, TAccessMode.Write, False);\n    for Y := 0 to DataResult.Height - 1 do\n    begin\n      for X := 0 to DataResult.Width - 1 do\n      begin\n        PixelA := DataA.Pixels[X, Y];\n        PixelB := DataB.Pixels[X, Y];\n        PixelResult.R := (PixelA.R + PixelB.R) div 2;\n        PixelResult.G := (PixelA.G + PixelB.G) div 2;\n        PixelResult.B := (PixelA.B + PixelB.B) div 2;\n        DataResult[X, Y] := PixelResult;\n      end;\n    end;\n  finally\n    DataA.Unmap();\n    DataB.Unmap();\n    DataResult.Unmap();\n  end;\nend;\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturborium%2Fbitmappixels","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fturborium%2Fbitmappixels","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturborium%2Fbitmappixels/lists"}