• 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

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

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


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

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

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

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

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

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

Войти

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

Войти

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

    • От Вадим Смоленский
      Узнал, что в 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 интересующей меня формы. На ноуте выводится где и хотел, а на планшете выше и левее. Смещение не кратно никак масштабу. В доступе планшета нет, как отлаживать не придумаю.
      Косяк всё же в в масштабе может быть или иное?
    • От Юрий Гусач
      Доброго дня!
      Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?
       
       
    • От Андрей Лещинский
      Здравствуйте ребята. С Firemonkey знаком только два дня. Многое уже подчеркнул с данного форума. Спасибо вам. 
      Проблема заключается в том, что у меня sdk для андроид 7 версии. Я собираю apk файл, запускаю его на Андроид 7 и все отлично, но как только я устанавливаю приложение на Андроид например версии 5, то при запуске оно мерцает пару раз и потом отображается отлично. Не подскажите в чем проблема? Я пробовал проект с данного форума, чтобы форма уходила под статусбара. Вот все они и мерцают на Андроид ниже 7, другие не пробовал проекты
      Стаж у меня только 2 дня, скажите в какую сторону смотреть мне далее
    • От Вадим Смоленский
      В феврале я сетовал, что мое Windows-приложение не хочет нормально запускаться в Linux под Wine 3.0. Но время идет, вышел Wine 3.6 - и теперь один из тестировщиков радостно сообщил, что всё заработало, за вычетом одного досадного момента. А именно: приложение способно сохранять фокус ввода лишь долю секунды, потом теряет. Соответственно, невозможно ничего ввести в текстовые боксы, разве только одну-две буквы. Можно щелкнуть по заголовку приложения, оно опять получит фокус - и через мгновение снова потеряет. Куда именно при этом переходит фокус, непонятно. Тестировщик утверждает, что только мое приложение ведет себя так, все остальные работают нормально.
      Нет ли у кого-нибудь идей? Что нужно проверить?
    • От Вадим Смоленский
      В декабре я задавал здесь вопрос о борьбе с перехватами нажатий клавиш компонентом TWebBrowser. Продвинутый пользователь Kami посоветовал тогда, раз уж меня интересует только Windows, поставить хук на клавиатуру. Поделился полезной ссылкой. Добавил, что можно еще много чего нагуглить. Что-то действительно нагуглилось - но не в том объеме, чтобы я смог четко понять, как это следует делать. Вопросов много. Куда именно должна быть воткнута функция KeyboardProc? Что в ней должно содержаться, чтобы управление передавалось уже написанному обработчику события FormKeyDown? Многие также упоминают о возникающих проблемах с юникодом, и хорошо было бы понять, как уберечься от них.
      Буду очень признателен, если кто-нибудь осветит эту темную для меня материю.
    • От Вадим Смоленский
      Как преобразовать тип HString в обычную строку?
      Нагуглил упоминания о функции TWindowsString.HStringToString, которая должна находиться в System.WinrtHelpers. Но такого юнита в поставке Delphi не наблюдаю. Может, его можно где-нибудь раздобыть? Или существуют иные способы?
  • Последние посетители   0 пользователей онлайн

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