Странное Delphi Android-изображение / искаженное изображение
У меня есть некоторый код, который отлично работает в iOs, но в результате получается совершенно испорченные изображения на Android. Я нашел частичный обходной путь (не вызывать некоторый код), но он намекает, что что-то ужасно неправильно:
// some bitmap object buffer for mainthread only
R.BitmapRef := FPersistentBitmapBuffer;
// this TImage now contains the original wrongly sized bitmap
ImageBackground.Bitmap.Assign(R.BitmapRef);
// calculated somewhere
TmpNewWidth := 500;
TmpNewHeight := 500;
// draw the bitmap resized to wanted size
R.BitmapRef.Width := Round(TmpNewWidth);
R.BitmapRef.Height := Round(TmpNewHeight);
R.BitmapRef.Canvas.BeginScene();
R.BitmapRef.Canvas.DrawBitmap(ImageBackground.Bitmap, RectF(0,0,ImageBackground.Bitmap.Width,ImageBackground.Bitmap.Height), RectF(0,0,TmpNewWidth,TmpNewHeight), 1);
R.BitmapRef.Canvas.EndScene();
// assign it back to the image
ImageBackground.Bitmap.Assign(R.BitmapRef);
// THIS code causes the image shown in TImageBackground to look completely garbled ... which would indicate something is shareing memory/reference somewhere somehow... There is more odd behavior like debugger unhooking (it seems) if mouse in Delphi debugger hovers over ImageBackground.Bitmap - no error is reported
R.BitmapRef.Clear(TAlphaColorRec.White);
Как видно, это последняя строчка, которая все испортила. В некоторых тестах этого оказалось достаточно, чтобы удалить линию, но не в других. Это мой лучший пример / описание / пример проблемы.
Вот пример того, как выглядит искаженное изображение. Поскольку каждый раз, когда я запускаю приложение, они выглядят искаженными одинаково, я подозреваю, что оно должно как-то относиться к изображению, но визуального сходства нет.
Мой вопрос, что может быть не так? Я тестирую пробную версию Delphi XE7, поэтому не могу получить доступ к источнику. Он работал безупречно на iOS с использованием XE4 и XE7, но с Android что-то происходит. Я думаю, что это могут быть некоторые растровые данные, которые делятся ссылкой... Есть ли у кого-нибудь идеи о том, как проверить эту теорию / возможные обходные пути?
1 ответ
Это выглядит явно неправильно. Я бы посоветовал вам заполнить отчет об ошибке по адресу http://quality.embarcadero.com/
Попробуйте использовать CopyFromBitmap вместо "Назначить". Это создаст уникальную копию изображения. Вы также получите новое уникальное изображение, если вы позвоните MyBitmap.Map(TMapAccess.Write, MyBitmapData);
с последующим MyBitmap.UnMap(MyBitmapData);
,