• 0
umkes

Динамическое создание Bitmap

Вопросы

Добрый день, возникла проблема при работе с TImage;

У меня компонент TImage - imgRing и есть в TImageList. 

Я динамически формирую Bitmap из копий картинки из TImageList и асайню его в TImage. На Windows все работает прекрасно, а на андроиде картинка все время пустая... Может кто-то подскажет, где я не прав :)

//==============================================================================
procedure TMainForm.DrawRing;
//------------------------------------------------------------------------------
var
  bmp1, bmp2 : TBitmap;
  i : integer;
  str : TMemoryStream;
begin
  bmp2 := TBitmap.Create;
  bmp2.Assign(ImageList.Source.Items[3].MultiResBitmap.Items[0].Bitmap);

  bmp1 := TBitmap.Create;
  bmp1.Assign(bmp2);
  bmp1.Width := ClientWidth + bmp2.Width * 10;
  i := 0;
  bmp1.Canvas.BeginScene();
  while (i * bmp2.Width) < bmp1.Width do begin
    bmp1.Canvas.DrawBitmap(bmp2,
                           RectF(0, 0, bmp2.Width, bmp2.Height),
                           RectF(i * bmp2.Width, 0, (i + 1) * bmp2.Width, bmp2.Height),
                           1
                          );
    inc(i);
  end{ while };

  bmp1.Canvas.EndScene;

  str := TMemoryStream.Create;
  bmp1.SaveToStream(str);
  str.Position := 0;

  imgRing.BeginUpdate;
  imgRing.Bitmap.CreateFromStream(str);
  imgRing.EndUpdate;
end{ procedure TMainForm.DrawRings };

Делаю такое потому-что TImage.WrapMode.Tile не подходит для моей задачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 ответов на этот вопрос

  • 0
ImageList.Source.

точно там 4 картинки? у меня было такое. не отображалось в ListView

Может попробовать?

 bmp2.Assign(ImageList.Source.Items[0].MultiResBitmap.Items[0].Bitmap);
Изменено пользователем AndroidHalfNoob

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Там 4 картинки и мне нужна именно 3-я :)

Еще раз напомню, что на винде все работает.

Изменено пользователем umkes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Всеравно ничего с андроидом не происходит.

Пробую еще вот так: 

//==============================================================================
procedure TMainForm.DrawRing;
//------------------------------------------------------------------------------
var
  bmp1, bmp2 : TBitmap;
  i : integer;
begin
  bmp2 := TBitmap.Create;
  bmp2.Assign(ImageList.Source.Items[3].MultiResBitmap.Bitmaps[1]);

  bmp1 := TBitmap.Create;
  bmp1.Assign(bmp2);
  bmp1.Width := ClientWidth + bmp2.Width * 10;
  i := 0;
  bmp1.Canvas.BeginScene();
  while (i * bmp2.Width) < bmp1.Width do begin
    bmp1.Canvas.DrawBitmap(bmp2,
                           RectF(0, 0, bmp2.Width, bmp2.Height),
                           RectF(i * bmp2.Width, 0, (i + 1) * bmp2.Width, bmp2.Height),
                           1
                          );
    inc(i);
  end{ while };

  bmp1.Canvas.EndScene;
  
  imgRing.Bitmap.Assign(bmp1);
  bmp1.Free;
  bmp2.Free;
end{ procedure TMainForm.DrawRings };

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

umkes, PrintScreen ImageList-а можете выложить?

Хотя не надо, в Windows же работает

Интересно, а если закомментировать этот участок, то картинка вообще приходит?

  bmp1.Width := ClientWidth + bmp2.Width * 10;
  i := 0;
  bmp1.Canvas.BeginScene();
  while (i * bmp2.Width) < bmp1.Width do begin
    bmp1.Canvas.DrawBitmap(bmp2,
                           RectF(0, 0, bmp2.Width, bmp2.Height),
                           RectF(i * bmp2.Width, 0, (i + 1) * bmp2.Width, bmp2.Height),
                           1
                          );
    inc(i);
  end{ while };

  bmp1.Canvas.EndScene;

 

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Копайте в сторону скейла картинки. На винде он равен 1, а на вашем девайсе скорее всего отличный от 1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Опытным путем было выяснено что что-то не так с ImageList или самой картинкой. Если тоже самое сделать для первых трех картинок то все хорошо, а с последней теперь отображается пазл из обрезков первой картинки. Пробовал даже тянуть битмап из отдельного TImage, а не из TImageList, эффект тот же.

Может студия глючит... В среду буду копать дальше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Решил проблему тем, что выполнил эту процедурку два раза подряд. Почему оно так работает, так и не понял...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От brunnengi
      Здравствуйте.
      Как отключить клавиатуру, что бы она не вылетала при получении фокуса в полях ввода?
    • От Mohamed BEN AMMAR
      hello 
      i'm using delphi fmx for building android App
      i have this code for Activating The WI-FI icon from android device:
      This could be found here .
      =========== code ==================
      uses
        Androidapi.Helpers,
        Androidapi.JNI.JavaTypes,
        Androidapi.JNI.GraphicsContentViewText,
        Androidapi.JNIBridge,
        Androidapi.JNI.WifiManager;
        procedure SetWifiEnabled (AEnable: Boolean); var   Obj: JObject;   WifiManager: JWifiManager; begin   Obj: = SharedActivityContext.getSystemService (TJContext.JavaClass.WIFI_SERVICE);   if Obj = nil then     Exit;     WifiManager: = TJWifiManager.Wrap ((Obj as ILocalObject) .GetObjectID);   WifiManager.setWifiEnabled (AEnable); end; 
       
       My question is About Activating Android location:
        Is it possible to activate the service location icon from android device
       programatically without using the Location or TLocationSensor component ....?
      however I know exactly that google has been Deactivate this API since android "4" just for security reasons .....
      but i have seen many apps in playstore can activate the service without using 
      this code here ask the user for activate the location manually .... procedure TForm1.GPSSettings; {$IFDEF ANDROID} var Intent: JIntent; {$ENDIF} begin {$IFDEF ANDROID} Intent := TJIntent.Create; Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_LOCATION_SOURCE_SETTINGS); TAndroidHelper.Activity.startActivity(Intent); {$ENDIF} end; in other versions like lolipopup can show just the Allow Permission system dialog timer ....( Asking the user for Allowing this App to Activate the service location ......) 
      I have an android device with lolipopup version and i try to execute the location EMBARCADERO sample but 
      this one can not activate the service location ICON even  my device show me the Allow permission dialog where i choose yes allow
      with never ASK....
      Finally ,  I like the WI-FI code above .....
      and i'm wondering if someone here can do this task for me (i need a unit as the WI-FI code above which can offer me
      the option to activate the Service Location ICON )
      I'm ready to paid for that task .....
       
      Sincerelly: Brave.
    • От GMX
      Android 6 MIUI
       ни стандартные примеры не работают, ни попытки что-то свое создать... 
      LastDiscoveredDevices - всегда 0, хотя из настроек устройства находятся. 
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Bluetooth, System.Bluetooth.Components, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Bluetooth1: TBluetooth; Label1: TLabel; AniIndicator1: TAniIndicator; procedure Button1Click(Sender: TObject); procedure Bluetooth1DiscoverableEnd(const Sender: TObject); procedure Bluetooth1DiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Bluetooth1DiscoverableEnd(const Sender: TObject); begin Label1.Text := IntToStr(Bluetooth1.LastDiscoveredDevices.Count); end; procedure TForm1.Bluetooth1DiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList); begin Label1.Text := IntToStr(ADeviceList.Count); AniIndicator1.Enabled :=False; end; procedure TForm1.Button1Click(Sender: TObject); begin Bluetooth1.DiscoverDevices(10000); AniIndicator1.Enabled :=True; end; procedure TForm1.FormCreate(Sender: TObject); begin while not Bluetooth1.Enabled do Bluetooth1.Enabled := True; end; end. В разрешениях bluetooth, bluetooth admin, coarse location, fine location включены... 
    • От Barbanel
      Всем привет!
      Поясните мне плиз, такую вещь как TTouchAnimation, на примере Android.
      Как я это понимаю:
      Есть к примеру некая кнопка, которая имеет несколько состояний, из которых важны: не нажатая и нажатая.
      В момент нажатия, TTouchAnimation пускает расходящийся круг, причем четко из центра нажатия.
      Ок, пусть на самом деле не круг, а картинку, указанную в... собсно, где???
      Как задать эту область, которая должна отображаться как реакция на нажатие?В редакторе среды, у объектов TButtonStyleObject есть свойство TouchAnimation: (TTouchAnimationAdapter), у которого в свою очередь есть свойство Link: (TBitmapLinks), которое как я считал и отвечает за эту область.
      Однако, при клике на это поле ничего не происходит.
      Баг среды, или моя удача???
      Как вы с этим боретесь?
      Других полей, где могли бы быть эти координаты я не нахожу.
      Заранее спасибо!

    • От Yarpda
      Подскажите пожалуйста есть ли какая-то информация по работе с Google календарем из FMX?
      Может быть у кого-то есть практика работы с ним? На форуме информации по этому поводу никакой не нашел.
      Интересует вопрос чтения и создания событий в календаре.
      Заранее благодарю.
    • От Вадим Смоленский
      Узнал, что в UWP API включены средства для получения уникального идентификатора компьютера. Это юнит Windows.System.Profile, класс HardwareIdentification, метод getPackageSpecificToken. Существуют ли способы обратиться к этим средствам из Delphi?
      Вообще, я привык считать, что такая идентификация компьютера в принципе невозможна, в отличие от мобильных устройств. Но прогресс, как известно, не остановить.
    • От Tarik Live
      Здравствуйте! Уже почти неделю пытаюсь завести библиотеку org.eclipse.paho.client.mqttv3-1.2.0 в своём приложении. Я знаю о существовании компонента от TMS, но он не умеет работать в фоновом сервисе.
      Вот код который я использую для тестов:
       
      Стандартная библиотека org.eclipse.paho.client.mqttv3-1.2.0 выпадает в ошибку initializer error сразу на строчке 
      mqtt:=TJMqttClient.JavaClass.init(StringToJString('tcp://m23.cloudmqtt.com:11021'), StringToJString('java')); по логам с телефона стало понятно, что проблема в логах 😐 а конкретно когда библиотека пытается создать логгер выпадает ошибка что не найден файл локализации ru_RU для logcat (сами файлы там вроде как есть). Ладно. Скачал исходники почистил код библиотеки от упоминаний логгера, собрал ииии и ничего. Продвинулся до строчки 
      mqtt.connect(); также пробивал 
      mqtt.connect(mqttconopt); ничего не помагает, получаю ошибку сегментации класса 
      Пока не понятно куда копать дальше? Возможно что не все библиотеки можно использовать в delphi приложениях? 

      P.S Старая версия 1.1.1 тоже не завелась :(
      service test2.rar
    • От Вадим Смоленский
      Для задач, связанных с вводом японского текста, мне нужно научиться перехватывать системное сообщение WM_IME_NOTIFY. Насколько могу судить, в FireMonkey эти вещи делаются (если вообще делаются) принципиально иначе, нежели в VCL. Конкретного ничего не нагуглил. Не поможет ли кто?
    • От slav_z
      У меня для приложений написанных на FireMonkey не вызывается меню игры windows. Для VCL все в порядке. XE8. Если у кого есть решение этой проблемы, поделитесь пожалуйста. (комбинация клавиш Win+G при запущенном приложении)
    • От POV
      Винда 10, два компа (рабочий ноут и планшет от мелкософта - у первого 100% экран, у другого 200%).
      Исходя из габаритов разных там компонентов и другой формы, рассчитываю Top и Left интересующей меня формы. На ноуте выводится где и хотел, а на планшете выше и левее. Смещение не кратно никак масштабу. В доступе планшета нет, как отлаживать не придумаю.
      Косяк всё же в в масштабе может быть или иное?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу