Уже лучше !
https://youtu.be/5nJR591Muaw
Но это прямо "героическое превозмогание " какое-то на ровном месте ...
(Основная проблема очень "медленный и печальный" процесс отладки )
В начале для отладки пришлось писать никому ненужный "пиксельный доступ"
function JSetPixel32(B: JBitmap; x, y: Integer; C: TRGBA): Boolean;
function JGetPixel32(B: JBitmap; x, y: Integer): TRGBA;
Внезапно оказалось что доступ работает с созданными JBitmap но не работает с загруженным... Как там? "Ничего не понимаю!"(с)
(Это вообще как? Формат пикселей совпадает,разрешение совпадает... он оказывается есть еще "выравнивание" (ага "великие уравнители" мимо пробегали)+разумеется процессе поска решения испортил формат цветопередачи ну исправил и это .. )
Теперь можно волны пускать ? Ага Можно! Но только после героической правки очередного "вайб-кода" процедуры 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;