Пишу кроссплатформне додаток. Результат пошуку відображається в TGrid. Став питання відображення картинки в одній з колонок.
На Windows все ок, але на планшеті відбуваються просто чудеса: при першому відображення все коректно, але якщо простоколіть вгору-вниз як картинки одні перетіраются іншими, частина взагалі відображається догори ногами.
Код для збереження картинки (jpg) в базу:
if Assigned (sm) then begin sm.Position: = 0; //TBlobField(dmData.cdsPlayerData.FieldByName('Photo')).LoadFromStream(sm); vImage: = TImage.Create (nil); try sm.Position: = 0; vImage.Bitmap.LoadFromStream (sm); vKoef: = vImage.Bitmap.Height / 64; vImage.Bitmap.Resize (Trunc (vImage.Bitmap.Width / vKoef), Trunc (vImage.Bitmap.Height / vKoef)); sm.Free; sm: = TMemoryStream.Create (); try vImage.Bitmap.SaveToStream (sm); TBlobField (dmData.cdsPlayerData.FieldByName ( 'SmallPhoto')). LoadFromStream (sm); finally sm.Free; end; finally vImage.Free; end; end; До скрол:
Пробував і LiveBinding, і ручну промальовування - результат один і той же. Є ідеї що не так?
P.S. Знаю що потрібно робити через TListView, але замовник хоче «сіточку як в старій програмі», так як на android буде працювати тільки на планшетах - я погодився.
Вітаю!
Стоїть завдання завантажувати фотографії і відображати їх в списку. Здавалося б, як два пальці, але.
Код працював довгий час, все вантажилось і відображалося. Через якийсь час, фото грузиться перестали. Дебаггінг виявив, замкнутий нескінченний цикл в цій процедурі:
procedure TBitmap.AssignFromSurface (const Source: TBitmapSurface); var BitmapData: TBitmapData; MaxSize: Integer; ResampledSurface: TBitmapSurface; I: Integer; SourceRect: TRectF; begin MaxSize: = CanvasClass.GetAttribute (TCanvasAttribute.MaxBitmapSize); <-- MaxSize = 0 if (Source.Width> MaxSize) or (Source.Height> MaxSize) then begin SourceRect: = TRectF.Create (0, 0, Source.Width, Source.Height); SourceRect.Fit (TRectF.Create (0, 0, MaxSize, MaxSize)); ResampledSurface: = TBitmapSurface.Create; try ResampledSurface.StretchFrom (Source, Trunc (SourceRect.Width), Trunc (SourceRect.Height), PixelFormat); AssignFromSurface (ResampledSurface); <-- infinity loop here finally ResampledSurface.Free; end; end else begin SetSize(Source.Width, Source.Height); if Map(TMapAccess.Write, BitmapData) then try for I := 0 to TBitmapSurface(Source).Height - 1 do Move(TBitmapSurface(Source).Scanline[I]^, BitmapData.GetScanline(I)^, BitmapData.BytesPerLine); finally Unmap(BitmapData); end; end; end; В самом начале процедуры MaxSize получает значение 0 (ноль!), размеры картинки больше нуля и процедура влетает в бесконечный цикл на строке
AssignFromSurface (ResampledSurface);
Хтось стикався? Є думки як лікувати?
Всім дякую!
Доброго дня. Існує одна проблема, з якою вже кілька тижнів не можу впоратися. Є старий код під WinAPI, його потрібно переробити під Android через firemonkey. І головна проблема - є код, який з власного формату робить HBITMAP з WinAPI. Фактично це структура, де останнім поле - покажчики на біти. Це переробити легко, створивши власну копію такої структури. Але тепер мені потрібно перевести її в TBitmap, і я не дуже розумію як це зробити.
Часто при відображенні бітмапами на полотні використовується метод DrawBitmap, де, зокрема, в якості аргументу необхідно вказати прямокутні області джерела (SrcRect) і приймача (DestRect). Ці прямокутники мають формат запису (Left, Top, Right, Bottom).
При вказівці в якості SrcRect всього бітмапами цілком як тут на формуме так і в книзі Осипова я зустрічав такий запис:
RectF (0,0, ABitmap.Width, ABitmap.Height) Але моя логіка підказує, що такий бітмапами повинен мати розміри на 1 піксель по горизонталі і вертикалі більше, ніж насправді, адже перший піксель має координати (0; 0), а останній (ABitmap.Width, ABitmap.Height). Що, напевно, призводить до викривлення при відображенні бітмапами на полотні.
Мені здається, що при малюванні цілого бітмапами слід писати так:
RectF (0,0, ABitmap.Width-1, ABitmap.Height-1) Чи правий я чи не правий? Якщо ні, то чому?
Привіт друзі!
Підкажіть - як, з максимально можливою швидкістю, визначити відсутність зображення як такого в TBitmap?
Тобто - є TBitmap. Він або заповнений зображенням (картинка), або він - абсолютно чорний прямокутник.
Яким способом можна дізнатися - що в ньому саме зображення? Тобто - НЕ абсолютно чорний прямокутник.
І визначити це потрібно "миттєво" (умовно кажучи).
Заздалегідь всім вдячний за участь!
P.S. Варіанти типу того що нижче - не пропонувати)) Хотілося б щось "швидше"! Ще раз дякую!
function IsBitmapEmpty (Bmp: TBitmap): Boolean; var X, Y. Integer; BmpData: TBitmapData; yAddr. Integer; AlphaCount. integer; begin Result: = False; try AlphaCount: = 0; Bmp.Map (TMapAccess.Read, BmpData); for Y: = 0 to Bmp.Height div 2 do begin YAddr: = Y * Bmp.Height; for X: = 0 to Bmp.Width - 1 do if (PAlphaColorArray (BmpData.Data) ^ [YAddr + X] <> TAlphaColorRec.Null) and (PAlphaColorArray (BmpData.Data) ^ [YAddr + X] <> TAlphaColorRec.Black) then begin inc (AlphaCount); Break; end; if AlphaCount> 0 then Break; end; finally Bmp.Unmap (BmpData); Result: = AlphaCount = 0; end; end;
Delphi Seattle, Android 5.0.1
Формую картинку через ScanLine. На виході отриманий бітмапами малюється на полотні TImage, на якому перед цим був намальований Rect.
GlobalBitmap - формований tbitmap.
with ObjectPreviewImage.Bitmap.Canvas do begin BeginScene; Clear (TAlphaColorRec.White); DRect: = TRectF.Create (0, 0, GlobalBitmap.Width + 8, GlobalBitmap.Height + 8); DrawRect (DRect, 0, 0, AllCorners, StealthForm.ObjectPreviewImage.AbsoluteOpacity); DRect: = TRectF.Create (0, 0, GlobalBitmap.Width, GlobalBitmap.Height); DrawBitmap (GlobalBitmap, DRect, TRectF.Create (2, 2, GlobalBitmap.Width + 2, GlobalBitmap.Height + 2), 1); EndScene; end;
Проблема власне в чому - в андроїдної версії зліва і внизу рамка "з'їдається". У Win32 версії все відмінно. На доданих скріншотах це чітко видно.
Документацію читав, гугл гугл.
Що я роблю не так? Або це невідомі підводні камені андроидного малювання на полотні?
P.S. Картинка однакова, колір до певної області застосовується не вірно. Походу теж Андроїдні приколи. Але з цим я вже розберуся.
P.P.S. Вже розібрався з кольором - під андроїдом Blue і Red в пікселі треба поміняти місцями. А щодо канви - не виходить ніяк.
P
Вже на добу "завис".
Використовую iDHTTP (iDHTTP теж "кидал" на форму і створював динамічно - результат один) і TMemoryStream.
Код нижче.
Сам додаток на пристрої видає помилку: Access violation at address 559E45CC accessing address 00000000
Отладчик видає: class segmentation fault 11
Дослідним шляхом встановив, що помилка, швидше за все, виникає при спробі заповнення TMemoryStream (пробував TMemoryStream.LoadFromFile - те ж саме, хоча додатком TListViewItem.BitMap.LoadFromFile з цим же файлом проходить на ура і все працює).
Як вивести текст на зображення так, щоб його можна було зберегти в .jpg форматі.
P.S. Немає методу TextOut у Image.
Перевіряв на OS X - Mountain Lion 10.8.3
Після Map / Unmap-оновлення картинки, зображення на 3D-формі з TImage3D не оновлюється.
Ось простий приклад - TestMap.zip - за таймером заносить шум в TImage3D.Bitmap.
У XE7 працює і під Win32 і під OSX.
У XE8 під win32 працює, а під OSX відображає білий фон. Якщо над формою провести якимось іншим вікном, то в цьому місці картинка, тобто її частина (в нашому випадку шум), промальовується. Теж саме якщо нашу форму вивести за екран і потягнути назад - в місцях появи форми відображається частина нашої картинки (шуму).
BeginUpdate / EndUpdate і Repaint результату не дали.
XE8 Update1 - те ж саме.
Як це побороти?
(Звичайний TImage відпрацьовує нормально).
Зараз на сторінці 0 користувачів
Немає користувачів, які переглядають цю сторінку