В контексте, предоставленном пользователем, возникает проблема с обработкой изображений в Android-приложении, созданном с использованием LAMW (Lazarus Android Module Wizard). Пользователь хочет:
Загрузить изображение (битмап)
Отобразить его на форме
Преобразовать в градации серого
Сохранить измененное изображение
Основная сложность возникает на этапе преобразования пикселей изображения в градации серого.
Решение с использованием LAMW
В LAMW для работы с изображениями используются классы jBitmap и jCanvas. Для доступа к пикселям изображения можно использовать несколько подходов.
Вариант 1: Использование встроенных методов LAMW
procedure TForm1.ConvertToGrayScale;
var
bmp: jBitmap;
width, height: Integer;
pixels: array of Integer;
i: Integer;
r, g, b, gray: Integer;
begin
// Получаем битмап (предполагаем, что он уже загружен)
bmp := jBitmap1;
// Получаем размеры изображения
width := bmp.GetWidth;
height := bmp.GetHeight;
// Получаем пиксели изображения
SetLength(pixels, width * height);
bmp.GetPixels(pixels);
// Преобразуем в градации серого
for i := 0 to High(pixels) do
begin
r := (pixels[i] shr 16) and $FF; // Красный канал
g := (pixels[i] shr 8) and $FF; // Зеленый канал
b := pixels[i] and $FF; // Синий канал
// Формула преобразования в градации серого
gray := Round(0.299 * r + 0.587 * g + 0.114 * b);
// Собираем новый пиксель
pixels[i] := $FF000000 or (gray shl 16) or (gray shl 8) or gray;
end;
// Устанавливаем измененные пиксели обратно в битмап
bmp.SetPixels(pixels);
// Обновляем изображение на экране
jImageView1.SetImageBitmap(bmp);
end;
Вариант 2: Использование Java-кода через JNI
Если встроенные методы LAMW не предоставляют нужной функциональности, можно вызвать нативные Java-методы:
procedure TForm1.ConvertToGrayScaleWithJNI;
var
env: PJNIEnv;
bmp: jBitmap;
cls: jClass;
method: jMethodID;
pixels: array of Integer;
width, height: Integer;
begin
// Получаем JNI environment
env := GetJNIEnv;
// Получаем Java-объект битмапа
bmp := jBitmap1.GetJavaBitmap;
// Получаем класс Bitmap
cls := env^.FindClass(env, 'android/graphics/Bitmap');
// Получаем метод getPixels
method := env^.GetMethodID(env, cls, 'getPixels', '([IIIIIII)V');
// Получаем размеры изображения
width := jBitmap1.GetWidth;
height := jBitmap1.GetHeight;
// Создаем массив для пикселей
SetLength(pixels, width * height);
// Вызываем Java-метод getPixels
env^.CallVoidMethod(env, bmp, method,
pixels, 0, width, 0, 0, width, height);
// Далее обработка пикселей как в предыдущем примере
// ...
end;
Альтернативное решение: использование OpenCV
Для более сложных операций с изображениями можно интегрировать OpenCV:
procedure TForm1.ConvertToGrayScaleWithOpenCV;
var
bmp: jBitmap;
mat: JObject;
grayMat: JObject;
begin
// Загружаем битмап в OpenCV Mat
bmp := jBitmap1;
mat := jOpenCV1.BitmapToMat(bmp);
// Преобразуем в градации серого
grayMat := jOpenCV1.CvtColor(mat, jOpenCV1.COLOR_RGB2GRAY);
// Конвертируем обратно в битмап
bmp := jOpenCV1.MatToBitmap(grayMat);
// Отображаем результат
jImageView1.SetImageBitmap(bmp);
end;
Сохранение изображения
Для сохранения измененного изображения:
procedure TForm1.SaveImage;
var
bmp: jBitmap;
path: string;
begin
bmp := jBitmap1;
path := GetEnvironmentDirectory(dirDownloads) + '/gray_image.jpg';
bmp.SaveToFile(path, 90); // 90 - качество JPEG
ShowMessage('Изображение сохранено: ' + path);
end;
Заключение
Для работы с пикселями изображения в LAMW можно использовать:
Встроенные методы jBitmap (рекомендуемый способ)
Прямые вызовы Java-методов через JNI
Интеграцию с OpenCV для сложных операций
Первый вариант наиболее прост и безопасен, так как использует встроенные возможности LAMW. Второй вариант требует больше знаний о работе JNI, но может предоставить доступ к дополнительным функциям. Третий вариант подходит для сложной обработки изображений.
Статья описывает методы вызова метода getPixels объекта Bitmap в Java внутри проекта на Delphi или Pascal с использованием LAMW, включая варианты с встроенными методами, JNI и OpenCV.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.