Android-приложения в Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Seenkao
энтузиаст
Сообщения: 588
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

wwswowsogon писал(а):E:\laz4android2.2.2\android-ndk-r26b\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\lib\aarch64-linux-android\22
там где написано windows-x86_64, должен быть либо путь для Linux, либо где-то внутри папка с указанием пути linux-x86_64\sysroot\lib\aarch64-linux-android\22.
wwswowsogon писал(а):В описании LAMW сказано - Install * Gradle 6.6.1
пробуй, у меня вроде заработало, когда я поменял на нужную версию (давно не пользовался).
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Так мой архив не пробовали ? Там уже полностью установленный laz4android2.0.12 и распакуйте его например в папку E:\LAMW
(рабочий диск i : (если его нет ) проще всего получить с помощью команды SUBST I: E:\ правда работает это до перезагрузки )
Дальше установите или скопируйте в I:\LAMW
android-ndk-r22b
android-sdk-windows
apache-ant-1.9.6
gradle-6.6.1
Java
lamw_manager
и запустите лазарус из I:\LAMW\laz4android2.0.12\

ЗЫ
Долго держать архив в облаке не буду ( точенее так сказать "без гарантии" ) так что скачайте (если интересует) его себе .
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

"Возвращение к резидента " 2 :wink:
На днях попытался освежить свой опыт программирования под андроид в Лазарусе с помощью LAMW
Сходу попытался.
Воспользоваться этой инструкций

Код: Выделить всё

1. Скачайте Lazarus для Android
Вариант а) Laz4Android (Windows)

Все кроссплатформенные компиляторы для Android уже установлены!
arm-android/aarch64-android/i386-android/x86_64-android/jvm-android
подсказка: установите, как здесь: "C:\laz4android" (а не "Program Files" !!!)
Как сделать:
Установите Laz4Android
Установите LAMW
Скачайте LAMW и распакуйте архив в любую папку
Рекомендуемая папка: "C:\laz4android\components"
Порядок установки пакетов:
tfpandroidbridge_pack.lpk (в папке "..../android_bridges")
lazandroidwizardpack.lpk (в папке ""..../android_wizard")
amw_ide_tools.lpk (в папке "..../ide_tools")
Перейдите к разделу «2. Настройка инфраструктуры».
Вариант б) Менеджер LAMW

Все в одном! LAMW Manage создает полноценную среду Lazarus для Android, автоматизируя этап «2. Настройка инфраструктуры»!
Установщик LAMW Manager для Linux
Установщик LAMW Manager для Windows
Вариант в) Fpcupdeluxe (Linux и Windows)

Linux + Fpcupdeluxe + LAMW
Вариант d) Инструкция: сделайте сами!

d.1) Скачайте Lazarus2.x.y
d.2) Установите LAMW
Скачайте LAMW и распакуйте архив в любую папку
рекомендуемая папка: "C:\lazarus2.x.y\components"
Порядок установки пакетов:
tfpandroidbridge_pack.lpk (в папке "..../android_bridges")
lazandroidwizardpack.lpk (в папке ""..../android_wizard")
amw_ide_tools.lpk (в папке "..../ide_tools")
d.3) Получите исходный код FPC (основная ветка):
Распакуйте архив в какую-нибудь папку и укажите исходный путь на шаге «d.4».
d.4) Перейдите в меню Lazarus "Инструменты" -> "[LAMW] Мастер модулей Android" -> "Сборка FPC для Android" и повторите процесс "Сборки и установки" один раз для каждой архитектуры.
(x) Armv7a + софт (32-разрядная версия для Android <<-- протестировано!)

Сборка
Установка
(x) Aarch64 (64-битная версия Android <<-- протестировано!)

Сборка
Установка
Подсказка: после «сборки» и «установки» кросс-компиляторов и выполнения всех пунктов раздела «2. Инфраструктура» перейдите к разделу «3. Использование LAMW» и попробуйте создать свой первый [новый] проект LAMW!

Если вы получаете ошибку "Fatal: не удается найти модульную систему, используемую fcllaz из пакета FCL". при попытке "Выполнить" --> "Построить" ваш проект, перейдите в "fpc.cfg" (например. "C:\lazarus2.x.y\fpc\3.2.2\bin ") и:

изменение:
        #путь поиска для юнитов и других системных компонентов
 -FuC:\lazarus2.x.y\fpc\$FPCVERSION/units/$fpctarget 
 -FuC:\lazarus2.x.y\fpc\$FPCVERSION/units/$fpctarget/* 
 -FuC:\lazarus2.x.y\fpc\$FPCVERSION/units/$fpctarget/rtl
Для:
       #путь поиска для юнитов и других системных элементов
 -FuC:\lazarus2.x.y\fpc\3.2.2/units/$fpctarget 
 -FuC:\lazarus2.x.y\fpc\3.2.2/units/$fpctarget/* 
 -FuC:\lazarus2.x.y\fpc\3.2.2/units/$fpctarget/rtl
и перейдите в меню Lazarus IDE "Инструменты" -> "Параметры" -> "Среда".
«Источник FPC»
изменение:
 $(LazarusDir)fpc\$(FPCVer)\source 
Для:
 $(LazarusDir)fpc\3.2.2\source
2. Настройка инфраструктуры :: только для тех, кто не пользуется «LAMW Manager» !!
2.1 Установите Java JDK и Gradle для сборки системных apk
рекомендуется: Java JDK 21 + версия Gradle > = 8.5
рекомендуется: Java JDK 17 + версия Gradle >= 8.1.1
устарело: Java JDK 11 + версия Gradle > = 6.7.1
минималистская альтернатива: Java JDK 1.8 + версия Gradle <= 6.7
JDK 1.8 поддерживает ограниченную, но легковесную систему Ant для сборки APK
2.2. Скачайте Android SDK
рекомендуется: поддержка JDK 21 + версии Gradle > = 8.5

скачать commandlinetools-win-11076708_latest
скачать commandlinetools-linux-11076708_latest
скачать commandlinetools-mac-11076708_latest
Как сделать:

распакуйте инструменты командной строки в формате ".zip" во "временную" папку
создайте дерево каталогов, например: C:\android\sdkJ21\cmdline-tools\latest
скопируйте все содержимое "временной" папки в папку "...\sdkJ21\cmdline-tools\latest"
откройте терминал или командную строку и перейдите в "...\sdkJ21\cmdline-tools\latest\bin"
запустите команду >> sdkmanager "build-tools;35.0.0" "platforms;android-35" "platform-tools"
подсказка: с помощью sdkmanager вы можете получить и другие компоненты для Android...
рекомендуется: поддержка JDK 17 + версии Gradle >= 8.1.1

скачать commandlinetools-win-11076708_latest
скачать commandlinetools-linux-11076708_latest
скачать commandlinetools-mac-11076708_latest
Как сделать:

распакуйте инструменты командной строки в формате ".zip" во "временную" папку
создайте дерево каталогов, например: C:\android\sdkJ17\cmdline-tools\latest
скопируйте все содержимое "временной" папки в папку "...\sdkJ17\cmdline-tools\latest"
откройте терминал или командную строку и перейдите в "...\sdkJ17\cmdline-tools\latest\bin"
запустите команду >> sdkmanager "build-tools;35.0.0" "platforms;android-35" "platform-tools"
подсказка: с помощью sdkmanager вы можете получить и другие компоненты для Android...
устарело: поддержка JDK 11 + Gradle версии >= 6.7.1

скачать commandlinetools-win-9123335_latest
скачать commandlinetools-linux-9123335_latest
скачать commandlinetools-mac-9123335_latest
Как сделать:

распакуйте инструменты командной строки в формате ".zip" во "временную" папку
создайте дерево каталогов, например: C:\android\sdkJ11\cmdline-tools\latest
скопируйте все содержимое "временной" папки в папку "...\sdkJ11\cmdline-tools\latest"
откройте терминал или командную строку и перейдите в "...\sdkJ11\cmdline-tools\latest\bin"
запустите команду >> sdkmanager "build-tools;35.0.0" "platforms;android-35" "platform-tools"
подсказка: с помощью sdkmanager вы можете получить и другие компоненты для Android...
Минималистичная альтернатива: поддержка JDK 1.8 + ограниченная, но легкая Ant система сборки Apk + Gradle <= 6.7

скачать r25.2.5-windows
скачать r25.2.5-linux
скачать r25.2.5-macosx
Как сделать:

распакуйте/установите файл ".zip" в папку, например "sdkJ1.8"
откройте терминал командной строки или cmd и перейдите в папку "sdkJ1.8\tools"
запустите команду >>android update sdk //для открытия графического интерфейса SDK Manager
перейдите в раздел Инструменты и оставьте все как есть
Android SDK Tools (установлены)
(x) Android SDK Platform-Tools
(x) Android SDK Build-Tools 29.0.3 (и более поздние версии)
перейдите в Android R и снимите все галочки!
перейдите в Android 10 API 29, снимите все галочки и оставьте только
(x) Платформа SDK
Перейдите в раздел Дополнительно и проверьте:
(x)Репозиторий поддержки Android
(x)Google USB Drive (только для Windows...)
(x)Репозиторий Google
(x)Сервисы Google Play
Установите пакет версии 7 или выше!
ВАЖНО: в терминале командной строки или cmd перейдите в папку «sdkJ1.8\tools\bin»
запустите команду >>sdkmanager --update
запустите команду >>sdkmanager "build-tools;30.0.2" "platforms;android-35"
ВАЖНО: build-tools = 30.0.3 — это максимальная версия, поддерживаемая в данной конфигурации!
2.3 Скачайте Android NDK
рекомендуемая версия
r21e
2.4 Получите конструктор Ant
Просто распакуйте zip-файл в удобное для вас место...
2.5 Получите Gradle builder
рекомендуемые версии
Java JDK 21: Gradle 8.5 или выше
Java JDK 17: Gradle 8.2.1 или выше
Java JDK 11: Gradle 7.6.3 или выше
Java JDK 1.8: Gradle 6.7 или ниже
Используйте опцию «извлечь сюда», чтобы создать папку «gradle-x.y.z» в удобном месте...
предупреждение: для сборки Gradle требуется подключение к Интернету!!!
3. Использование LAMW
3.1) Настройка путей:
Меню Lazarus IDE "Инструменты" -> "[LAMW] Мастер модулей Android" -> "Настройки путей ..."
подсказка: [macOS>= 10.5] Путь к автоматической настройке Java JDK как: ${/usr/libexec/java_home}
3.2) Как создать и запустить свой первый Android-apk!
3.2.1) В среде IDE Lazarus выберите "Проект" -> "Новый проект"
3.2.2) В отображаемом диалоговом окне выберите "[LAMW] GUI Android Module" и "Ok"
3.2.3) Заполните поля отображаемой формы и нажмите "Ок" и "Сохранить".
подсказка: "Путь к рабочей области" — это папка с вашими проектами!
подсказка: примите параметры "по умолчанию"! (но обратите внимание на звездочки)
подсказка: поищите в папке с проектом... там вы найдете много интересного! (ищите проект Lazarus в папке ".../jni")
3.2.4) В среде разработки Lazarus IDE выберите "Выполнить" -> "Построить"
Успех! Ваша система готова к созданию первого APK-файла для Android!
3.2.5) Настройте телефонное устройство на режим отладки / параметры разработчика и подключите его к USB-порту компьютера
3.2.6) В среде разработки Lazarus IDE выберите "Выполнить" -> "[LAMW] Создать Apk и запустить".
Поздравляем! Теперь вы разработчик Android!
( https://github.com/jmpessoa/lazandroidmodulewizard )
Кроме подробной инструкции там есть скрипт "автоматической установки"
https://github.com/dosza/LAMWManager-win/releases
(не смотря на красивую инсталляцию это просто батник и скрипт для PowerShell )
Но у меня он "уперся рогом" на стадии установки JDK ( возможно если выпилить установку Java он справится хотя какой-то он хитромудрый с вредной "привычкой" отключать антивирус и вываливать кучи хлама на системный диск, а мои вялые попытки модификации особых результатов не дали )
И установить сравнительно свежий laz4android 3.4 что к сожалению не получилось
(В основном из за проблем настройкой SDK )
Так что решил повторить свой прежний опыт и поставить "старый добрый" laz4android 2.0.12
Краткая инструкция от "Синего кита" ДипСек

Код: Выделить всё

Шаг 1. Куда что кладём: вся структура
Перед началом просто посмотри, что у нас получится в итоге. Все инструменты будут лежать в одной папке.

text
X:\lamw\
|   ├── projects\               (Здесь будут твои проекты)
|   ├── sdk\                    (Android SDK)
|   ├── ndk\                    (Android NDK)
|   ├── gradle\                 (Gradle для сборки)
|   ├── LAMW\                   (Исходники самого LAMW)
|   ├── apache-ant-1.9.6\       (Ant, нужен для старых проектов)
|   └── Laz4Android\            (Главная IDE — Lazarus)
Шаг 2. Скачиваем все компоненты
Это самый важный момент. Используй именно те версии, которые указаны, — с новыми LAMW может не подружиться .

JDK (Java): Просто скачай и установи. В отличие от всего остального, он ставится в систему, но это нормально.

Что: jdk-8uXXX-windows-x64.exe

Где взять: Официальный сайт Oracle или Adoptium. Версия должна быть 8-я, не 11, не 17 .

Laz4Android: Это готовая версия Lazarus со всеми кросскомпиляторами .

Что: laz4android2.2.2.7z (или 2.0.12 — это стабильные версии).

Где взять: GitHub проекта smarano/laz4android (в разделе Releases).

Куда распаковать: X:\lamw\Laz4Android

Android SDK & NDK: Инструменты от Google. Старые версии совместимы лучше.

Что SDK: android-sdk_r24.4.1-windows.zip .

Что NDK: android-ndk-r10e-windows-x86.zip .

Где взять: Официальный сайт Android Developer (в архиве).

Куда распаковать: SDK → X:\lamw\sdk, NDK → X:\lamw\ndk.

Gradle: Нужен для современной сборки APK.

Что: gradle-6.8.3-bin.zip (Версия строго 6.x.x! 7-я и выше несовместимы) .

Где взять: Официальный сайт Gradle (services.gradle.org/distributions).

Куда распаковать: X:\lamw\gradle

Apache Ant: Старый, но нужный инструмент.

Что: apache-ant-1.9.6-bin.zip

Где взять: Официальный сайт Apache (archive.apache.org).

Куда распаковать: X:\lamw\apache-ant-1.9.6

LAMW (исходники): Сам набор компонентов и волшебников.

Что: Репозиторий jmpessoa/lazandroidmodulewizard .

Где взять: Скачай как ZIP с GitHub (зелёная кнопка "Code" -> "Download ZIP").

Куда распаковать: X:\lamw\components\

Шаг 3. Первая сборка Laz4Android
Теперь создадим исполняемые файлы Lazarus.

Открой Командную строку (cmd) от имени администратора (это важно для создания символьных ссылок).

Перейди в папку, куда распаковал Laz4Android:

cmd
cd /d X:\lamw\Laz4Android
Запусти скрипт сборки:

cmd
build.bat
Этот процесс займёт 10-20 минут. Ты увидишь много текста в окне — это нормально. В конце должно быть сообщение об успехе.

Шаг 4. Устанавливаем пакеты LAMW в Lazarus
Теперь "научим" наш Lazarus работать с Android.

Запусти Lazarus: открой папку X:\lamw\Laz4Android и дважды кликни startlazarus.exe.

В открывшейся IDE выбери меню Package → Open Package File (.lpk).

Важно: Сначала найди и открой файл tfpandroidbridge_pack.lpk. Он лежит по пути X:\lamw\components\lazandroidmodulewizard\android_bridges\ .

В открывшемся окне нажми Compile.

Затем нажми Use >> Install.

Lazarus спросит: "Do you want to rebuild Lazarus now?" — смело жми Yes. IDE закроется и пересоберётся с новым пакетом.

После перезапуска повтори эти же шаги для двух оставшихся пакетов в строгой последовательности :

Сначала lazandroidwizardpack.lpk (из папки android_wizard).

Потом amw_ide_tools.lpk (из папки ide_tools).
После каждого пакета Lazarus будет перезапускаться. Это нормально.

Шаг 5. Настраиваем пути
Среда почти готова. Осталось указать ей, где лежат все нужные файлы.

В Lazarus перейди в меню Tools → [LAMW] Android Module Wizard → Path settings... .

Откроется окно настроек. Заполни его так (кнопка "..." помогает выбрать папку):

Path to Java JDK: C:\Program Files\Java\jdk1.8.0_xxx (или куда ты его установил).

Path to Ant bin: X:\lamw\apache-ant-1.9.6\bin

Path to Android SDK: X:\lamw\sdk

Path to Android NDK: X:\lamw\ndk

Path to Android Gradle: X:\lamw\gradle

Path to Simonsay's templates: X:\lamw\components\lazandroidmodulewizard\java

Нажми OK и перезапусти Lazarus (File → Restart).

Шаг 6. Первый проект и решение типичной ошибки
Можно пробовать! Создай новый проект: Project → New Project → [LAMW] GUI Android Module. Назови его, например, MyFirstApp.

При создании проекта обрати внимание на параметры:

Instruction Set: ARMv7a + VFPv3 (это для 32-битных устройств) .

Min SDK API: 19 (это для совместимости с Android 4.4+) .

Внимание: При первой сборке ты можешь получить ошибку "Fatal: Cannot find system used by fcllaz" . Она лечится просто:

Иди в папку X:\lamw\Laz4Android\fpc\3.2.0\bin\i386-win32 (путь может немного отличаться, главное найти fpc.cfg).

Открой файл fpc.cfg Блокнотом.

Найди строчки, где написано -Fu...\$FPCVERSION/...

Замени $FPCVERSION на конкретную версию 3.2.0.

Сохрани файл. Всё должно заработать.

Что в итоге
Вся твоя среда разработки (кроме самой Java) находится в папке X:\lamw\. Если захочешь перенести её на другой компьютер — просто скопируй эту папку. Для запуска IDE используй X:\lamw\Laz4Android\startlazarus.exe.

Поздравляю, ты справился. Эта ручная настройка даёт тебе полный контроль, а портативная версия больше никогда не будет засорять системный диск.
....
Вот это получилось лучше тем более что у меня уже был раннее настроенный SDK
Кстати решил загадочную проблему с созданием нового проекта (нужно было удалить "странный" 30.0.0-preview из sdk\platforms)
Итого имею
========================================
LAMW Diagnostic Check
========================================

[1] Checking Java...
[OK] Java found: lamw\Java\jdk1.8.0_181_64\
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
[OK] Java is version 8

[2] Checking NDK version...
Pkg.Revision = 22.1.7171670

[3] Checking Gradle version...
Gradle 6.6.1

[4] Checking LAMW installation...
[OK] LAMW found

[5] Checking Android SDK...
[OK] Android SDK found
Installed platforms:
android-14
android-17
android-21
android-23
android-28
android-29
android-30

========================================
Diagnostic complete
========================================
Последний раз редактировалось Alex2013 13.06.2026 11:44:30, всего редактировалось 1 раз.
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

"Едем дальше ..."
1 Значительная часть примеров не собирается или не запускается(упираются в настройки сборки или возможности эмулятора )
2 Выявлены очень странные проблемы с редактором форм и вообще размещением контролов на форме ( но в примерах это как-то обходят так что возможно позже разберусь ).
3 Напрягает очень медленный запуск/перезапуск эмулятора (да и работает он не так что-бы быстро )
4 Сходу попытался адаптировать свою красивую демку "капли дождя" но куда-там (в принципе это возможно но подход к быстрому доступу к графике (без использования OpenGl ) совсем другой )
Зы
Кстати если интересно ...
Рабочая демка WaveDemo(Виндовс версия) с исходниками (на google drive)
Последний раз редактировалось Alex2013 05.07.2026 10:28:22, всего редактировалось 1 раз.
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Подставил на комп более мощный эмулятор Nox 7.0.6.2 (Андроид 7.1.2 можно и посвежее но пока и этого хватает)
в результате в программах бодро прорезался OpenGL
Изображение
Правда есть проблемы с автоматической установкой после компиляции
(нужно перед компиляцией каждый раз постоянно командовать LAMW\android-sdk-windows\platform-tools>adb connect 127.0.0.1:62001 )
Seenkao
энтузиаст
Сообщения: 588
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

https://forum.lazarus.freepascal.org/in ... 377.0.html
загляни сюда. Я вносил изменения в LAMW.
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Seenkao писал(а): 16.06.2026 19:07:12 https://forum.lazarus.freepascal.org/in ... 377.0.html
загляни сюда. Я вносил изменения в LAMW.
Спасибо посмотрю !

Зы
У меня тут в "Страшных муках творчества " появился вот такой модуль.
Но он всеравно не работает ( точнее "работает на половину" данные читает и обрабатывает но обратно не записывает )...

Код: Выделить всё

unit JBitmapUtils;

{$mode delphi}
{$POINTERMATH ON}

interface

uses
  Classes, SysUtils, AndroidWidget, And_jni;

type
  // Структура для удобного доступа к каналам пикселя (RGBA)
  PRGBA = ^TRGBA;
  TRGBA = packed record
    R, G, B, A: Byte;
  end;

procedure FastInvertJBitmap(JB: jBitmap);
procedure FastGrayscaleJBitmap(JB: jBitmap);
procedure FastBrightnessJBitmap(JB: jBitmap; Delta: Integer);

implementation

// ☆☆☆ БЫСТРАЯ ИНВЕРСИЯ ЦВЕТОВ ☆☆☆
procedure FastInvertJBitmap(JB: jBitmap);
var
  Buffer: jObject;
  Data: PJByte;
  Width, Height: Integer;
  PixelCount: Integer;
  i: Integer;
  Pixel: PRGBA;
begin
  if JB = nil then Exit;
  
  // Получаем размеры
  Width := JB.GetWidth;
  Height := JB.GetHeight;
  if (Width <= 0) or (Height <= 0) then Exit;
  
  PixelCount := Width * Height;
  
  // Получаем JByteBuffer
  Buffer := JB.GetJByteBuffer(Width, Height);
  if Buffer = nil then Exit;
  
  // Получаем указатель на данные
  Data := JB.GetJByteBufferAddress(Buffer);
  if Data = nil then Exit;
  
  // Инвертируем все пиксели
  for i := 0 to PixelCount - 1 do
  begin
    Pixel := PRGBA(Data + (i * 4));
    Pixel^.R := 255 - Pixel^.R;
    Pixel^.G := 255 - Pixel^.G;
    Pixel^.B := 255 - Pixel^.B;
    // Alpha не трогаем
  end;
  
  // Сохраняем изменения обратно в битмап
  JB.GetBitmapFromJByteBuffer(Buffer, Width, Height);
end;

// ☆☆☆ ПРЕОБРАЗОВАНИЕ В ГРАДАЦИИ СЕРОГО ☆☆☆
procedure FastGrayscaleJBitmap(JB: jBitmap);
var
  Buffer: jObject;
  Data: PJByte;
  Width, Height: Integer;
  PixelCount: Integer;
  i: Integer;
  Pixel: PRGBA;
  Gray: Byte;
begin
  if JB = nil then Exit;
  
  Width := JB.GetWidth;
  Height := JB.GetHeight;
  if (Width <= 0) or (Height <= 0) then Exit;
  
  PixelCount := Width * Height;
  
  Buffer := JB.GetJByteBuffer(Width, Height);
  if Buffer = nil then Exit;
  
  Data := JB.GetJByteBufferAddress(Buffer);
  if Data = nil then Exit;
  
  // Преобразуем в градации серого (формула: 0.299*R + 0.587*G + 0.114*B)
  for i := 0 to PixelCount - 1 do
  begin
    Pixel := PRGBA(Data + (i * 4));
    Gray := Round(0.299 * Pixel^.R + 0.587 * Pixel^.G + 0.114 * Pixel^.B);
    Pixel^.R := Gray;
    Pixel^.G := Gray;
    Pixel^.B := Gray;
    // Alpha не трогаем
  end;
  
  JB.GetBitmapFromJByteBuffer(Buffer, Width, Height);
end;

// ☆☆☆ ИЗМЕНЕНИЕ ЯРКОСТИ ☆☆☆
procedure FastBrightnessJBitmap(JB: jBitmap; Delta: Integer);
var
  Buffer: jObject;
  Data: PJByte;
  Width, Height: Integer;
  PixelCount: Integer;
  i: Integer;
  Pixel: PRGBA;
  R, G, B: Integer;
begin
  if JB = nil then Exit;
  
  Width := JB.GetWidth;
  Height := JB.GetHeight;
  if (Width <= 0) or (Height <= 0) then Exit;
  
  PixelCount := Width * Height;
  
  Buffer := JB.GetJByteBuffer(Width, Height);
  if Buffer = nil then Exit;
  
  Data := JB.GetJByteBufferAddress(Buffer);
  if Data = nil then Exit;
  
  // Изменяем яркость
  for i := 0 to PixelCount - 1 do
  begin
    Pixel := PRGBA(Data + (i * 4));
    
    R := Pixel^.R + Delta;
    G := Pixel^.G + Delta;
    B := Pixel^.B + Delta;
    
    // Ограничиваем значения
    if R < 0 then R := 0 else if R > 255 then R := 255;
    if G < 0 then G := 0 else if G > 255 then G := 255;
    if B < 0 then B := 0 else if B > 255 then B := 255;
    
    Pixel^.R := R;
    Pixel^.G := G;
    Pixel^.B := B;
    // Alpha не трогаем
  end;
  
  JB.GetBitmapFromJByteBuffer(Buffer, Width, Height);
end;

end.
не работает вот эта строка....
// Сохраняем изменения обратно в битмап
JB.GetBitmapFromJByteBuffer(Buffer, Width, Height);
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Ура ! "Хай живе Grok!" Тадам !

Код: Выделить всё

procedure FastInvertJBitmap(JB: jBitmap);
var
  P: PScanByte;  // или PJByte
  i, PixelCount: Integer;
begin
  if JB = nil then Exit;
  if not JB.GetInfo then Exit;  // обновит Width/Height/Format

  JB.LockPixels(P);  // P: PScanByte (массив байтов)
  try
    PixelCount := JB.Width * JB.Height;

    for i := 0 to PixelCount - 1 do
    begin
      // Порядок обычно: [A, R, G, B]  (индекс 0 = Alpha)
      P^[i*4 + 1] := 255 - P^[i*4 + 1];  // R
      P^[i*4 + 2] := 255 - P^[i*4 + 2];  // G
      P^[i*4 + 3] := 255 - P^[i*4 + 3];  // B
      // Alpha (i*4 + 0) оставляем как есть
    end;
  finally
    JB.UnlockPixels;
  end;
end;

Так заработало ! "Терпенье и труд выбросят бруд !"
v-t-l
энтузиаст
Сообщения: 749
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Alex2013 писал(а): 13.06.2026 10:55:30 "Едим дальше ..."
Приятного аппетита :-D
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

v-t-l писал(а): 18.06.2026 16:10:37
Alex2013 писал(а): 13.06.2026 10:55:30 "Едим дальше ..."
Приятного аппетита :-D
Там другой смысл "едим" от слова "езда"... Ну и намек на "съехавшую крышу", не без этого ... :wink:
Так что хорошие пожелание тут скорее "в добрый путь!". :idea:
v-t-l
энтузиаст
Сообщения: 749
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

"едЕм" от слова "езда", "едим" от слова "еда"!
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

v-t-l писал(а): 21.06.2026 12:17:50 "едЕм" от слова "езда", "едим" от слова "еда"!
О точно! Уел, однако! :D
Награда товарищу буквоеду в студию! (Тадам и музон из "что, где, когда!" )
Зы
"Просто так"
>>>WinWaveDemoBG_Norm.7z
Свежая и (если честно сырая) версия WaveDemo (Без OpenGl и DirectX чистый LCL и"ПиксельАрт")
(в процессе адаптации под андроид сделал тестовый прогон под винду)
Изображение
Без динамики непонятно поэтому вот
"ТРУБА ЗОВЕТ": https://youtu.be/xjQRgT3RDYI

Основная фишка "мультиплатформенная процедура WaveProcessorFXBin"
// ☆☆☆ УНИВЕРСАЛЬНАЯ ПРОЦЕДУРА РАБОТЫ С МАССИВОМ ПИКСЕЛЕЙ ☆☆☆
procedure WaveProcessorFXBin(
Pixels: PByte; // указатель на данные пикселей (RGBA)
Width, Height: Integer; // размеры изображения
var Waves:TWaveStateArray; // массив волн
GridSize: Integer; // размер сетки
X, Y: Integer; // -1 = только симуляция
Radius: Integer; // 0 = только симуляция
HeightWave: Single; // 0 = только симуляция
Viscosity, WavesSpeed, LightIntensity, Depth: Single;
Background: PByte = nil; // указатель на фон (nil = градиент)
BgWidth: Integer = 0; BgHeight: Integer = 0 // размеры фона
);

(Изначально эта версия заточена под формат пикселей RGBA(стандарт андроид) но в него можно легко конвертировать из "виндузного" BGR(A) )
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Почти так как должно быть (доработанный прогон под виндовс )
Изображение
https://youtu.be/oGD4FpbRmn8
Как есть...(на андроиде)
Изображение
https://youtu.be/y-0WoTlRFZk
("Без фона" точнее фон просто градиент мдя пока как-то не впечатляет.. )
Alex2013
долгожитель
Сообщения: 3324
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Уже лучше !
Изображение

https://youtu.be/5nJR591Muaw

Но это прямо "героическое превозмогание " какое-то на ровном месте ...
(Основная проблема очень "медленный и печальный" процесс отладки )

В начале для отладки пришлось писать никому ненужный "пиксельный доступ"
function JSetPixel32(B: JBitmap; x, y: Integer; C: TRGBA): Boolean;
function JGetPixel32(B: JBitmap; x, y: Integer): TRGBA;

Внезапно оказалось что доступ работает с созданными JBitmap но не работает с загруженным... Как там? "Ничего не понимаю!"(с) :roll:
(Это вообще как? Формат пикселей совпадает,разрешение совпадает... он оказывается есть еще "выравнивание" (ага "великие уравнители" мимо пробегали)+разумеется процессе поска решения испортил формат цветопередачи ну исправил и это .. )

Теперь можно волны пускать ? Ага Можно! Но только после героической правки очередного "вайб-кода" процедуры CopyBitmapToData проще вроде как придумать нельзя но "Синий Кит"(ДипСек) умудрился и в ней начудить !
Зы
Исправленные версии процедур и функций ...

Код: Выделить всё

type

 TRGBA = packed record
    R,G,B,A:Byte// Android формат: ARGB
  end;

function JSetPixel32(B: JBitmap; x, y: Integer; C: TRGBA): Boolean;
var
 P: PScanByte;
 Inf: AndroidBitmapInfo;
 rtn: Integer;
 Stride: Integer;
begin
 Result := False;

 // Получаем информацию о битмапе
 rtn := AndroidBitmap_getInfo(gApp.jni.jEnv, B.GetJavaBitmap, @Inf);
 if rtn <> 0 then Exit;

 // Вычисляем реальный stride
 Stride := Inf.stride; // Реальный stride в байтах

 B.LockPixels(P);
 try
   // Используем реальный stride
   Move(C, P[y * Stride + x * 4], 4);
   Result := True;
 finally
   B.UnlockPixels;
 end;
end;

function JGetPixel32(B: JBitmap; x, y: Integer): TRGBA;
var
 P: PScanByte;
 Inf: AndroidBitmapInfo;
 rtn: Integer;
 Stride: Integer;
begin
 FillChar(Result, SizeOf(Result), 0);

 rtn := AndroidBitmap_getInfo(gApp.jni.jEnv, B.GetJavaBitmap, @Inf);
 if rtn <> 0 then Exit;

 Stride := Inf.stride;

 B.LockPixels(P);
 try
   Move(P[y * Stride + x * 4], Result, 4);
 finally
   B.UnlockPixels;
 end;
end;
CopyBitmapToData

Код: Выделить всё


// ☆☆☆ КОПИРОВАНИЕ jBitmap → PByte ☆☆☆
procedure CopyBitmapToData(B: JBitmap; var Data: PByte);
var
  P: PScanByte;
  Inf: AndroidBitmapInfo;
  rtn: Integer;
  Stride: Integer;
  y, x: Integer;
  PixelCount,RowSize: Integer;

begin
  rtn := AndroidBitmap_getInfo(gApp.jni.jEnv, B.GetJavaBitmap, @Inf);
  if rtn <> 0 then Exit;
  if B = nil then Exit;

  PixelCount := B.Width * B.Height;

  if Data = nil then
    GetMem(Data, PixelCount * 4);

  Stride := Inf.stride;//Выравнивание 
  RowSize := Inf.width * 4; // Реальный размер данных строки без выравнивания

  B.LockPixels(P);
  try
    for y := 0 to Inf.height - 1 do
    For X := 0 to Inf.width - 1 do
    begin
      Move( p[y * Stride+X*4],Data[ y *  RowSize+X*4], 4);
    end;
  finally
    B.UnlockPixels;
  end;
end;
Последний раз редактировалось Alex2013 04.07.2026 10:30:56, всего редактировалось 1 раз.
Ответить