Bitmap
Двумерная битовая маска: прозрачность, контуры и морфологические операции.
Bitmap хранит один бит на ячейку: это CPU-маска, а не изображение RGBA или текстура GPU. Подходит для проверки занятых пикселей, построения контуров и расширения/сужения выделения. Новый ресурс имеет размер (0, 0); перед чтением или изменением выделите размер через Create либо CreateFromImageAlpha. Координаты целочисленные: 0 ≤ x < ширина, 0 ≤ y < высота. Собственный ресурс освобождайте через Dispose.
using var mask = new Bitmap();
mask.Create(new Vector2I(5, 5));
mask.SetBit(2, 2, true);
mask.GrowMask(1, new Rect2I(0, 0, 5, 5));
// mask.GetTrueBitCount() == 5Радиус 1 добавляет четыре соседние ячейки, без диагоналей: используется круговая окрестность. Resize масштабирует значения ближайшим соседом; он не добавляет пустую рамку и не сохраняет исходные координаты занятых ячеек.
CreateFromImageAlpha сравнивает альфу после преобразования копии изображения в LA8: строго alpha > threshold. RGB не участвует в выборе; исходное изображение не изменяется. Для сжатого изображения заранее подготовьте доступное несжатое представление. ConvertToImage создаёт независимое непрозрачное L8-изображение: false становится чёрным, true белым, а не прозрачным/непрозрачным.
OpaqueToPolygons возвращает контуры в координатах пересечения rect с маской. Чтобы получить координаты всей маски, прибавьте позицию этого пересечения к вершинам. Для всего изображения используйте new Rect2I(Vector2I.Zero, mask.GetSize()). Для Sprite2D дополнительно учитывайте центрирование, смещение, масштаб и выбранный кадр; метод не создаёт готовый объект физики. Порядок контуров, обработка произвольных отверстий и пригодность любого результата для коллизии не гарантированы этим примером.
Изменения битов и размера сами не испускают Resource.Changed. Если зависимая система слушает этот сигнал, после своей законченной операции явно вызовите EmitChanged. Data — внутреннее сериализованное представление, не валидатор внешних файлов. Не подставляйте произвольные байты.
Проверены 26 CPU-сценариев в Windows headless: размер, чтение/запись, пересечение прямоугольников, масштабирование, альфа, L8, рост/эрозия, корректный перенос Data и простой контур. Это не проверка рендера, сложной топологии, коллизий или других платформ.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
BitmapКонструктор
public Bitmap();Создаёт собственный Resource с размером (0, 0) и без выделенных ячеек. Перед работой вызовите Create/CreateFromImageAlpha; после работы Dispose.
Свойства1
DataСвойство
public Reckfell.Collections.Dictionary Data { get; set; }Внутренний Dictionary с ключами size (Vector2I) и data (byte[]). Getter создаёт словарь со снимком битовых данных; setter сначала Create(size), затем заменяет байты без проверки их длины и хвостовых битов. Используйте только корректное представление, созданное этим runtime; повреждённое содержимое может сделать последующие операции небезопасными. Getter-словарь освобождайте после использования.
Методы13
ConvertToImageImage
public Image ConvertToImage();Создаёт отдельный Image того же размера, L8 без mipmaps. true → белый, false → чёрный, альфа непрозрачна в обоих случаях. Не обновляет ранее созданный Image и не создаёт GPU-текстуру. Маска должна быть выделена; собственный результат освобождайте через Dispose.
ImageНовый собственный Image, L8 без mipmaps, не Texture2D.
Createvoid
public void Create(Vector2I size);Заменяет размер и очищает все биты, включая прежнее содержимое при том же размере. Обе стороны должны быть положительными; произведение не больше Int32.MaxValue. Не испускает Changed.
| Имя | Тип | По умолчанию |
|---|---|---|
size | Vector2I | — |
sizeПоложительные ширина/высота в ячейках; произведение ≤ Int32.MaxValue.
CreateFromImageAlphavoid
public void CreateFromImageAlpha(Image image, float threshold = 0.1f);Заменяет маску размером изображения. Копия Image преобразуется в LA8; бит true только при alpha/255 > threshold. Источник не изменяется, яркость RGB не влияет. Нужен непустой Image с поддерживаемым преобразованием формата.
| Имя | Тип | По умолчанию |
|---|---|---|
image | Image | — |
threshold | float | 0.1f |
imageНепустое исходное Image; используется альфа преобразованной LA8-копии.
thresholdСтрогий порог альфы, обычно 0…1. Равенство даёт false; сравнение после 8-битного преобразования, не по исходной float-точности. Setter не ограничивает значение диапазоном.
GetBitbool
public bool GetBit(int x, int y);Читает один бит по x/y. Допустимы только координаты внутри маски; выход за пределы диагностируется и возвращает false, поэтому false сам по себе не доказывает корректность координат.
| Имя | Тип | По умолчанию |
|---|---|---|
x | int | — |
y | int | — |
xСтолбец: 0 ≤ x < GetSize().X.
yСтрока: 0 ≤ y < GetSize().Y.
boolЗначение бита; false также является fallback при диагностике неверных координат.
GetBitvbool
public bool GetBitv(Vector2I position);То же чтение, что GetBit, с координатами Vector2I. Не выполняет обрезку или циклическое отображение координат.
| Имя | Тип | По умолчанию |
|---|---|---|
position | Vector2I | — |
positionКоординаты ячейки внутри маски, не мировая позиция или UV.
boolЗначение бита; false также возвращается при диагностике неверных координат.
GetSizeVector2I
public Vector2I GetSize();Возвращает ширину и высоту в ячейках. Новый ресурс без Create имеет размер (0, 0).
Vector2IVector2I ширины и высоты.
GetTrueBitCountint
public int GetTrueBitCount();Считает установленные биты. Для корректного представления это число занятых ячеек. Реализация считает все байты, включая хвостовые биты последнего байта: произвольный Data может нарушить этот смысл.
intЧисло установленных битов хранилища; для корректной маски равно числу true-ячеек.
GrowMaskvoid
public void GrowMask(int pixels, Rect2I rect);Положительный pixels расширяет true-области, отрицательный сужает, 0 ничего не меняет. Круговая окрестность читается из исходного снимка, без каскадного роста внутри вызова. При эрозии пространство вне rect считается false; ячейки вне rect не меняются. Передавайте rect внутри маски и разумный радиус: большой радиус дорог, крайние int не поддержаны этим обзором.
| Имя | Тип | По умолчанию |
|---|---|---|
pixels | int | — |
rect | Rect2I | — |
pixelsЦелочисленный радиус в ячейках: плюс расширяет, минус сужает, 0 пропускает операцию. Избегайте крайних int и больших радиусов.
rectОбласть внутри маски с неотрицательными размерами; снаружи неё значения сохраняются, но при эрозии её граница считается пустой.
OpaqueToPolygonsReckfell.Collections.Array<Vector2[]>
public Reckfell.Collections.Array<Vector2[]> OpaqueToPolygons(Rect2I rect, float epsilon = 2f);Ищет контуры true-ячеек в пересечении rect с маской методом marching squares, затем упрощает RDP. Вершины относительны позиции пересечения, не исходной маске. Пустая область даёт пустой массив; контуры с менее чем тремя вершинами пропускаются. Для контуров от 9 вершин epsilon ограничивается диапазоном 0…половина меньшей стороны области; меньшие обходят RDP. Результат не создаёт коллизию автоматически.
| Имя | Тип | По умолчанию |
|---|---|---|
rect | Rect2I | — |
epsilon | float | 2f |
rectПрямоугольник в координатах маски с неотрицательными размерами; обрезается границами маски, конец исключён.
epsilonДопуск упрощения в единицах маски, не доля и не мировой масштаб. Меньше обычно сохраняет больше деталей; RDP применяется не ко всем коротким контурам.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; вершины относительны обрезанной области. Это контейнер результата, не Resource с коллизией.
Resizevoid
public void Resize(Vector2I newSize);Масштабирует маску ближайшим соседом: исходная ячейка выбирается усечением xoldWidth/newWidth и yoldHeight/newHeight. Это не добавление пустых строк/столбцов. Тот же размер ничего не меняет; используйте положительные стороны. Нулевой размер не является безопасным способом очистки.
| Имя | Тип | По умолчанию |
|---|---|---|
newSize | Vector2I | — |
newSizeПоложительные целевые размеры для масштабирования, не количество добавляемых ячеек.
SetBitvoid
public void SetBit(int x, int y, bool bit);Устанавливает или сбрасывает ячейку. Координаты должны быть внутри маски; неверные диагностируются без записи. Resource.Changed автоматически не испускается.
| Имя | Тип | По умолчанию |
|---|---|---|
x | int | — |
y | int | — |
bit | bool | — |
xСтолбец: 0 ≤ x < GetSize().X.
yСтрока: 0 ≤ y < GetSize().Y.
bitНовое значение: true занято, false пусто.
SetBitRectvoid
public void SetBitRect(Rect2I rect, bool bit);Заполняет пересечение rect с границами маски значением bit. Правая/нижняя границы исключены; непересекающаяся область ничего не меняет. Это заполнение, а не переключение битов.
| Имя | Тип | По умолчанию |
|---|---|---|
rect | Rect2I | — |
bit | bool | — |
rectПрямоугольник в координатах маски с неотрицательными размерами; обрезается границами маски, конец исключён.
bitНовое значение: true занято, false пусто.
SetBitvvoid
public void SetBitv(Vector2I position, bool bit);То же изменение, что SetBit, с координатами Vector2I. Не меняет размер маски.
| Имя | Тип | По умолчанию |
|---|---|---|
position | Vector2I | — |
bit | bool | — |
positionКоординаты ячейки внутри маски, не мировая позиция или UV.
bitНовое значение: true занято, false пусто.