Jump to content

Search the Community

Showing results for tags 'tfgbitmap'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Clients
    • Download Trial
    • Download Release
    • News
    • Questions of future users
    • Voitng for new features
    • FGX Native projects
    • Feedbacks
  • Private forum. For users with active subscription
    • Animations
    • Alignment (Flexbox)
    • Components
    • Assets
    • Database
    • Graphics
    • Demos
    • Logging
    • Systems permissions
    • Dialogs
    • Notifications
    • Virtual keyboard
    • Gestures
    • Application
    • Forms
    • Platform Questions
    • Localization (L11N)
    • Publishing
    • IDE Designer
    • Emulator
    • Debugging
    • Component development
    • Additional files
    • iOS (Alpha testing)
    • Other questions
  • Bug Reports
    • Opened
    • Closed
  • Organization of the work of this forum
    • Rules

Blogs

  • Product Updates
  • Events
  • Guides

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me

Found 7 results

  1. Здравствуйте. Еще одним нововведением в релизе 1.11.2.0, помимо TfgPopup, является работа с пикселями ("сырыми данными") TfgBitmap. Доступ к пикселям открывает практически неограниченные возможности для обработки и анализа изображений. Так же в новом релизе будет добавлена возможность поворота изображения. Воможность работы с пикселями TfgBitmap. Общие сведения. Обращение к сырым данным возможно только между парными вызовами TfgBitmap.MapData и TfgBitmap.UnmapData, которые могут быть знакомы пользователям FMX. Однако, важным отличием от FMX, является отсутствие уровня доступа (только чтение/только запись/чтение и запись). Это сделано с целью ускорения доступа, т. к. работа осуществляется непосредственно с данными нативного изображения без создания промежуточного буфера. В результате вызова TfgBitmap.MapData вы получаете интерфейс IFGXBitmapData (более подробно рассмотрен ниже), который предоставляет доступ к пикселям изображения. Важно! Актуальность объекта IFGXBitmapData гарантирована только между вызовами TfgBitmap.MapData и TfgBitmap.UnmapData, т.к. используется "натуральный" интерфейс без подсчета ссылок. Важно! Во время доступа к сырым данным операции по изменению TfgBitmap запрещены (например загрузка из различных источников, изменение размера, масштаба, поворота и тд). Типичный пример работы с сырыми данными изображения: var LBitmapData: IFGXBitmapData; begin if LBitmap.MapData(LBitmapData) then try // Работа с пикселями изображения. finally LBitmap.UnmapData; end; end; Важно! Всегда проверяйте результат выполнения TfgBitmap.MapData во избежание непредвиденных последствий. Повторный вызов TfgBitmap.MapData для уже спроецированных данных вернет ложь. Интерфейс IFGXBitmapData. Интерфейс IFGXBitmapData предоставляет информацию об изображении (Info, Width, Height), а так же позволяет манипулировать пикселями изображения (RawData, Scanlines, Pixels, Colors). Информация о битмапе TfgBitmapInfo: BitsPerPixel — количество бит на один пиксель изображения. К примеру, для одного из самых распространенных вариантов ARGB, этот параметр будет равен 32-ум битам. BytesPerRow — количество байт на одну строку изображения. Обычно это Width * BitsPerPixel, но, в случае применения выравнивания для ускорения доступа к данным, значение может быть иным. PixelFormat — формат пикселя изображения. В отличии от фиксированного формата ARGB присущего стандартному типу TAlphaColor, нативные изображения могут иметь различный состав и порядок следования цветовых компонентов. Возможные комбинации этих параметров отражает тип TfgBitmapPixelFormat. TfgBitmapPixelFormat = (Unknown, Alpha, Gray, ARGB, RGBA, RGB, RGB24); IsAlphaPremultiplied — флаг, показывающий являются ли компоненты пикселя предварительно помноженными на компоненту прозрачности. Интерфейс IFGXBitmapData содержит несколько вариантов доступа к самим данным, которые отличаются по степени абстракции: RawData — самый низкий уровень. Возвращает указатель на начало данных. Размер данных можно узнать из свойства RawDataSize. Scanlines — указатель на переданную в аргументе строку. Размер данных строки в байтах можно получить из Info.BytesPerRow, количество пикселей в строке — Width. Pixels — указатель на пиксель. В аргументах передаются координаты пикселя. Размер пикселя в битах можно получить из Info.BitsPerPixel. Colors — цвет пикселя в стандартном формате TAlphaColor. В аргументах передаются координаты пикселя. Как правило, для достижения максимальной скорости при последовательном сканировании пикселей изображения, вместо индексного доступа (Pixels, Colors) используют инкрементный перебор начиная с некой точки отсчёта (начало изображения RawData, начало определенной строки Scanlines[Y], определенный пиксель Pixelsх[X, Y]) . В этом случае вы получаете указатель, вместо привычного TAlphaColor. Для преобразования данных по указателю в тип TAlphaColor вам могут пригодиться готовые варианты для конвератции, которые находятся в хэлпере TAlphaColorHelper из модуля FGX.Types.Color. Для формирования TAlphaColor из сырых данных используйте перегруженный конструктор: constructor Create(const APixel: PByte; const APixelFormat: TfgBitmapPixelFormat; const AIsAlphaPremultiplied: Boolean); overload; Для обратной операции подойдет метод: /// <summary>Записывает текущий цвет по адресу <c>APixel</c> с учетом опций <c>APixelFormat</c> и <c>AIsAlphaPremultiplied</c>.</summary> procedure ToPixel(const APixel: PByte; const APixelFormat: TfgBitmapPixelFormat; const AIsAlphaPremultiplied: Boolean); Реальный пример работы с сырыми данными. Ниже приведен кусок кода из нового демонстрационного примера "Графика" -> "TfgBitmap - работа с "сырыми" данными" в котором изображение преобразуется из цветного в оттенки серого. uses FGX.Types.Color, FGX.Canvas.Types, FGX.Canvas.Types, FGX.Assets, FGX.Assets.BitmapSet; procedure TFormMain.fgButton1Tap(Sender: TObject); var LBitmapSet: TfgAssetBitmapSet; LBitmap: TfgBitmap; LBitmapData: IFGXBitmapData; I, J: Integer; begin if not TfgAssetsManager.Current.Find<TfgAssetBitmapSet>('Image', LBitmapSet) then Exit; LBitmap := LBitmapSet.GetBitmap; if LBitmap.MapData(TfgBitmapDataAccessMode.ReadWrite, LBitmapData) then try for J := 0 to LBitmap.Height - 1 do for I := 0 to LBitmap.Width - 1 do LBitmapData.Colors[I, J] := LBitmapData.Colors[I, J].ToGrayscale; finally LBitmap.UnmapData; end; fgPaintBox1.Invalidate; end; Повороты изображения. Благодаря добавлению работы с сырыми данными появилась возможность с легкостью вращать изображения. Поворот осуществляется с помощью метода TfgBitmap.Rotate: /// <summary>Поворачивает изображение на указанный угол.</summary> procedure Rotate(const AAngle: TfgRotation); В качестве аргумента передается одно из предустановленных значений угла поворота. TfgRotation = (Rotation0 = 0, Rotation90 = 90, Rotation180 = 180, Rotation270 = 270); Поворот осуществляется по часовой стрелке. Благодарим за внимание и приятного коддинга 🙂.
  2. В продолжение темы. Пишу текст на фото. Но не срабатывает перенос строки. Что-то не так делаю? var Bitmap := TfgBitmap.Create; Bitmap.LoadFromFile(filename); Bitmap.Canvas.BeginPaint; try Bitmap.Canvas.Font.Size:= 50; Bitmap.Canvas.Fill.Color := TAlphaColorRec.Red; Bitmap.Canvas.Fill.Kind := TfgBrushKind.Solid; Bitmap.Canvas.FillText(Bitmap.Bounds, DateTimeToStr(now) + sLineBreak + DateTimeToStr(now) + sLineBreak + DateTimeToStr(now) ,True, TfgHorizontalAlignment.Right, TfgVerticalAlignment.Bottom); finally Bitmap.SaveToFile(filename); Bitmap.Canvas.EndPaint; end; FreeAndNil(Bitmap); Успешный сценарий который ожидаю. Дата в трех строчках
  3. Всем привет! Позвольте и эту тему апнуть Не могу поверх фото текст наложить. Пробую так. Как это необходимо делать верно? AResult.Bitmap - приходит из CameraCapturePhotoReady(Sender: TObject; const AResult: TfgCameraCaptureResult); filename := filename + strDate + '.png'; var B := AResult.Bitmap; // B.Canvas.BeginPaint; B.Canvas.Font.Size:= 50; B.Canvas.Fill.Color := TAlphaColorRec.Red; B.Canvas.Fill.Kind := TfgBrushKind.Solid; // var mRect :=B.LogicalBounds; // mRect.Width := mRect.Width - mRect.Width * 0.05; // mRect.Height := mRect.Height - mRect.Height * 0.05; B.Canvas.FillText(B.Bounds, DateTimeToStr(now) ,False, TfgHorizontalAlignment.Right, TfgVerticalAlignment.Bottom); B.SaveToFile(filename); // B.Canvas.EndPaint; TfgAssetsManager.Current.AddBitmap('asset_' + mainf.md5(filename), B);
  4. Здравствуйте, обнаружил неприятную особенность отрисовки текста. Охватило меня желание нарисовать текст в круге. procedure TFormMain.fgButton1Tap(Sender: TObject); var B:TfgBitmap; Sz:Integer; begin B:=TfgBitmap.Create; Sz:=128; B.Size:=Tsize.Create(Sz,Sz); B.Canvas.Fill.Color:=TAlphaColorRec.Green; B.Canvas.FillCircle(B.Size.cx/2,B.Size.cy/2,B.Size.cx/2); B.Canvas.Font.Size:=Sz/2; B.Canvas.Fill.Color := TAlphaColorRec.Red; B.Canvas.Fill.Kind := TfgBrushKind.Solid; B.Canvas.FillText(B.Bounds,'100',False); TfgAssetsManager.Current.AddBitmap('test',B); fgImage1.ImageName:='test'; end; И показать его на картинке. И не получилось Спасибо
  5. Здравствуйте. Имеем код: procedure TFormMain.fgPaintBox1Paint(Sender: TObject; const ACanvas: TfgCanvas); var aBm: TFgBitMap; begin try aBm := TFgBitMap.Create; aBm.Size := Tsize.Create(round(fgPaintBox1.Width), round(fgPaintBox1.Height)); aBm.Canvas.FillColor(TAlphaColorRec.Gray); aBm.Canvas.Stroke.Kind := TfgBrushKind.Solid; aBm.Canvas.Stroke.Color := TAlphaColorRec.Red; aBm.Canvas.Fill.Kind := TfgBrushKind.Solid; aBm.Canvas.Fill.Color := TAlphaColorRec.Yellow; aBm.Canvas.DrawCircle(aBm.Width / 2, aBm.Height / 2, aBm.Width / 2); ACanvas.DrawBitmap(aBm, 0, 0); finally aBm.DisposeOf; aBm := nil; end; end; Скэйл устройства =2. получили результат: Два вопроса: 1. на PaintBox битмап выводится с размерами в 2 раза меньше. Насколько я понял это связано со скэйлом устройства, и что бы битмап отобразился на весь PaintBox на экране, нужно задавать физические размеры битмапа в 2 раза (для данного устройства) больше. Где можно узнать скэйл устройства, что бы задать размеры битмапа соответствующие выводу на PaintBox? 2. Не очень понятно, почему примитивы на битмапе рисуются со скэйлом устройства?
  6. Здравствуйте. При установке размеров битмапа через свойства .Width и .Height происходит исключение: Через свойство .Size - размеры устанавливаются нормально.
  7. Добрый день S:=TMemoryStream.Create; try Bitmaps.Bitmaps[1].SaveToStream(S); Bitmaps.Bitmaps[1].SaveToFile(TPath.GetTempFileName+'.jpg'); //Файл 0 байт S.Position:=0; S.SaveToFile(TPath.GetTempFileName+'.jpg');// Файл 4мб finally S.Free; end; Внимание вопрос, почему ? Спасибо
×
×
  • Create New...