Перейти к содержанию
Fire Monkey от А до Я

Вячеслав

Пользователи
  • Постов

    127
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные Вячеслав

  1. Добрый день, форумчане! Столкнулся со следующей задачей: 

    Имеется TListBox с 32 итемами, задаются в DesignTime. В некоторых ситуациях требуется убрать половину, оставить только первые 16 итемов. Я делаю лишние невидимыми, но при этом область прокрутки листбокса остается прежней и излишне большой. В связи с этим вопрос: можно ли как-то ограничить область прокрутки? 

    XE7, Windows.

  2. Я возможно сейчас фигню напишу, палками не бейте. Под андроид не разрабатываю, но вот на винде вопрос общения через порт вставал неоднократно. И там это решалось либо через виртуальный com порт (драйвер от Microsoft), либо напрямую через драйвер производителя USB->UART микросхемы. Второй способ оказался куда приятнее.

    К примеру, берём популярную ft232. На их сайте http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples.htm в разделе для Delphi есть удобный Unit-обертка всех библиотечных функций и примеры. Также есть очень толковый мануал. Этот метод даёт куда больше возможностей для разработчика, начиная от большей стабильности работы, заканчивая различными бонусами в виде работы с памятью микросхемы, реализацией I2C, SPI и тд.

    К чему это я все? Просто нашёл на их сайте страницу про Андроид: http://www.ftdichip.com/Android.htm

    Если FTDI подошли к делу на андройде так же, как и на винде, то это может оказаться полезным.

  3. Память на утечки проверяете при закрытии программы?

    Помните, что в FMX анимации в цикле достаточно сильно нагружают процессор даже в том случае, если форма с анимацией в данный момент не показана (ой сколько я с этим эффектом намучился в свое время).

  4. Все, окончательно осознал механизм работы, теперь все стало на свои места. Все дело в том, что моя камера выдает данные в формате AARRGGBB, только вот значение старших двух бит равно $00, а не $FF. Поэтому картинка и воспринимается прозрачной для TImage. В итоге пробежался в цикле по памяти, поменял нули на $FF и все заработало. 

  5. Большое спасибо, этот метод работает, многое стало ясно. Правда, для меня это все равно не решение, т.к. в случае создания дополнительного потока только для пересохранения изображения в другом формате я получаю абсолютно такую же реализацию, как и с применением WinAPI и Vcl.Graphics.TBitmap. А это будет влиять на производительность, что в моем случае критично. 

    Поэтому у меня такой вопрос: нельзя ли заставить TImage сразу воспринимать изображение в формате BMP?

  6. Что-то не то у меня с выводом в Image, возможно какие-то проблемы с PixelFormat. Попытался отвязаться от камеры и заполнить данные изображения каким-либо незамысловатым образом:

    function TCamPSEye.GetFMXBitmap: FMX.Graphics.TBitmap;
    var
      bitdata: TBitmapData;
      i, j: Integer;
    begin
      Result := FMX.Graphics.TBitmap.Create;
      Result.SetSize(640, 480);
      if (Result.Map(TMapAccess.Write, bitdata)) then
        try
            for I := 0 to 640 - 1 do
              for j := 0 to 480 - 1 do
                begin
                  bitdata.SetPixel(i, j, i * j);
                end;
        finally
          Result.Unmap(bitdata);
        end;
    end; 

    Полученный битмап сохраняю на диск, получаю хорошую красивую картинку:

     

    test3FMX.bmp

  7. Не помогло. Странно, уже много вариантов перепробовал. В файл картинка сохраняется нормально. Пытаюсь сохранить в поток и загрузить потом из потока - не работает. Такое ощущение, что на этапе сохранения в файл изображение проходит через процедуру дополнительной проверки и каким-то образом преобразуется. Но что именно происходит, отследить не получается даже под дебагом.

  8. Почти заработало. Вот код:

    function TCamPSEye.GetFMXBitmap: FMX.Graphics.TBitmap;
    var
      bitdata: TBitmapData;
    begin
      if not CLEyeCameraGetFrame(fInstance, fData, 750) then
      begin
        raise Exception.Create('Can not get image data');
        Exit;
      end;
      Result := FMX.Graphics.TBitmap.Create;
      Result.SetSize(Resolution.X, Resolution.Y);
      //Result.
      if (Result.Map(TMapAccess.Write, bitdata)) then
        try
          Move(fData^, bitdata.Data^, Resolution.X * Resolution.Y * 4)
        finally
          Result.Unmap(bitdata);
        end;
    end;
    

    На выходе получается битмап с данными камеры, который прекрасно сохраняется на диск. А вот в TImage почему-то я его вывести не могу, появляется белая картинка. Вывожу так:

    procedure TFormMulticam.Button1Click(Sender: TObject);
    var
      bmp: FMX.Graphics.TBitmap;
    begin
      bmp := GCameraArray[0].GetFMXBitmap;
      bmp.SaveToFile('test2FMX.bmp');
      Image1.Bitmap.Assign(bmp);
      bmp.Free;
    end;
    

    Может, при создании битмапа нужно указывать какие-либо дополнительные атрибуты?

  9. Спасибо за ответы! Заглянул в исходники, в assign(bitmapSurface) тоже в конечном итоге все через Map/Unmap, плюс я не понял, как моему экземпляру TBitmapSurface задать значение Bits (свойство только для чтения, поле FBits недоступно, что и понятно). Еще поковыряюсь, чувствую, что уже скоро получу адекватный результат.

  10. Всем добрый день! Написал я тут для своих нужд на Делфи оболочку для работы с SDK для камер PSEye. Примеры были на C++ и С#. Почти все работает, подключает несколько камер, 60fps при VGA-разрешении выдает влёгкую. Но реализацию пришлось делать через VCL.Graphics.TBitmap, а не через фаирманковский. Отчего VCL проект работает шустрее, чем FMX.

    Данные с камеры я получаю в виде области памяти, имею указатель на начало и размер области (массив Byte, грубо говоря).

    В VCL получение битмапа реализовал через WinAPI функцию GetDIBits, создав предварительно свой заголовок (TBITMAPINFOHEADER).

    Хотелось бы узнать, можно ли в FMX как-то напрямую работать с памятью, занимаемой изображением? Где почитать про структуру FMX.Graphics.TBitmap?

  11. Поиграйтесь с настройками типа анимации, если не ошибаюсь, In, Out, InOut. Ну и еще крайне важно не слишком сильно забивать приложение всяческими свистоперделками, эффектами, которые нагружают основной поток при отрисовке. Можно также FrameRate изменить, но мне это в свое время не помогло.

    А вообще FM, к сожалению, хреново оптимизирована под подобные задачи. Особенно удручает тот факт, что все визуальные компоненты всегда отрисовываются, независимо от того, находятся ли они поверх остальных или перекрыты. Поэтому старайтесь сперва делать в интерфейсе минимум, а потом уже расширяйтесь.

×
×
  • Создать...