Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585

Загрузить webp изображение в TBitmap

03.07.2025, 09:33. Показов 2816. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Необходимо загрузить (и, соответственно, преобразовать) файл webp-изображения в TBitmap.

Чисто технически, Билдер это точно умеет делать, т.к. компонент TImage может загружать webp-изображения - при этом они хранятся там как тип TSkImage, но далее все функции копирования изображения из такого TImage в TBitmap завершаются неудачей.

Пробовал вызывать skia-функции напрямую, что-то вроде такого:
C++
1
TSkImage::MakeFromEncodedFile("1.webp")->EncodeToFile("1.bmp", TSkEncodedImageFormat::BMP);
Но создается файл нулевого размера.

Единственное, что хоть как-то работает на уровне костылей, это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::unique_ptr<TBitmap> bmp(new TBitmap);  // сюда мне нужно сохранить результат
std::unique_ptr<TImage> image(new TImage(nullptr));
image->Picture->LoadFromFile("1.webp");
PaintBox1->Width  = image->Picture->Width;  // PaintBox1 должен лежать на форме, иначе не работает((
PaintBox1->Height = image->Picture->Height;
PaintBox1->Canvas->Draw(0, 0, image->Picture->Graphic);
bmp->Width  = image->Picture->Width;
bmp->Height = image->Picture->Height;
bmp->PixelFormat = pf24bit;
            BitBlt(
                bmp->Canvas->Handle,
                0,
                0,
                bmp->Width,
                bmp->Height,
                PaintBox1->Canvas->Handle,
//                image->Canvas->Handle,   // если брать хэндл напрямую у image, то не работает  
                  0,
                  0,
                  SRCCOPY);
Но такой вариант не подходит, т.к. работает только если изображение умещается на форме (иначе обрезается) и только если видна сама форма.

Мне же нужна работа с изображениями любого разумного размера (больше, чем размер формы). Да и хотелось бы без костылей. Если ли идеи?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.07.2025, 09:33
Ответы с готовыми решениями:

Повернуть изображение Graphics::TBitmap
Есть одно загруженное изображение Graphics::TBitmap *Temp Есть пустое изображение куда надо...

Webp codec for Windows XP
Всем доброго времени суток! Хочу научить Windows XP поддерживать .webp формат файлов. Исходный код...

Подвести Jpeg к TBitmap, функция CopyRect , С++ Buider
Здравствуйте! В моей программе мне нужно копировать часть рисунка , функция CopyRect замечательно...

15
Злостный нарушитель
 Аватар для Verevkin
10264 / 5688 / 1266
Регистрация: 12.03.2015
Сообщений: 26,377
03.07.2025, 11:43
Ненавижу С++Билдер лютой ненавистью. Это как суржик между С++ и Delphi (objpascal). Тьфу, мерзость.
Однако, твой костыль я, таки, сделал. Даже прозрачность работает.

0
Злостный нарушитель
 Аватар для Verevkin
10264 / 5688 / 1266
Регистрация: 12.03.2015
Сообщений: 26,377
03.07.2025, 12:10
Лучший ответ Сообщение было отмечено znseday как решение

Решение

Добавил открытие файлов.
Дальше сам, я пошёл пиво пить...

Вложения
Тип файла: 7z thread3209958.7z (2.28 Мб, 27 просмотров)
1
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585
08.08.2025, 10:11  [ТС]
Возник очень любопытный очередной сюрприз от Билдера.

Как оказалось, если собирать программу (Release, без dynamic RTL и runtime пакетов) на C++Builder 12.2, то при наличии где-либо хотя бы одной строки:
C++
1
#include <Vcl.Skia.hpp>
экзешник не запускается на 50% компьютерах с Windows 10. Причем, нет вообще никаких ошибок, просто тыкаем по exe и вообще ничего не происходит. Ради эксперимента даже впихнул MessageBox первой строчкой кода WinMain - и на половине компьютеров ничего не появляется.
Если же убрать строку с подключением skia, то программа всё равно компилируется, но уже запускается на всех компьютерах, но webp-файлы не загружаются (выскакивает сообщение о неизвестном расширении файла).

Но это еще не весь сюрреализм. Если программу скомпилировать на версии Билдера 12.3, то всё работает везде.

Я сначала подумал, что это какой-то глюк в моём проекте, но абсолютно всё вышеизложенное проверено и на проекте от Verevkin, который он выкладывал выше с своем сообщении.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
08.08.2025, 11:14
Доброго. Попробуйте перед сборкой релиз сделать Project-> Cleaan...
0
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585
08.08.2025, 11:44  [ТС]
Dinkin, Доброго. Пробовал. Даже папку со сборкой целиком сносил и *.local файл проекта удалял.
0
 Аватар для Наталья8
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,914
18.09.2025, 14:17
Цитата Сообщение от znseday Посмотреть сообщение
экзешник не запускается на 50% компьютерах с Windows 10.
Не запускаеться....
Верёвкин... Ты здесь?
Поставил я бильдер++ 10.3
Теперь опять учиться надо. Забыл всё...
webp я на ffmpeg раскодировал... Там AVI_шный кодек....
0
Злостный нарушитель
 Аватар для Verevkin
10264 / 5688 / 1266
Регистрация: 12.03.2015
Сообщений: 26,377
18.09.2025, 14:33
Цитата Сообщение от Наталья8 Посмотреть сообщение
Верёвкин... Ты здесь?
Чо тебе?
0
 Аватар для Наталья8
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,914
18.09.2025, 18:06
Привет...
А почему я вчера натянул Memo1..
А в него одна строчка верхняя, и она затираеться следующей...
Какое то волшебное слово надо?
C++
1
2
3
4
{// Кнопку это нажимать.
static int wert{};
Memo1->Text=String(++wert);
}
В TMemo должно быть много строк а не одна с верху...
---------
И как преобразовывать между типами. String и std::string?
Так -
C++
1
2
 std::string word{"1234567"};
  String next_word(word);
Я вообще char люблю...
и wchar_t...
String она на UTF8?
Вот они наворочали...
Мне число - время надо взять, и новую папку так назвать.
И от куда то мессага вылетает... Обращение к адресу 00001...
Убрать нельзя...
Надо нажимать на выключение компьютера, и потом отмена...
Что то я делаю не так...

C++
1
2
3
4
5
6
7
 BOOL create_fld(wchar_t* cmdline)
{
CreateDirectoryW(cmdline, NULL); // создаём папку (если сегодняшней нет)
wchar_t prin_t[63];
wsprintf(prin_t, L"%s%s",L"Создал папку с имянем: ", wcsrchr(cmdline, '\\')+1);
 return MessageBoxW(NULL, prin_t, L"Warning", MB_OK | MB_ICONWARNING | MB_SETFOREGROUND | MB_SYSTEMMODAL);
}
C++
1
2
3
4
5
6
7
8
9
10
wchar_t cmdline[MAX_PATH] = {};
        GetModuleFileName(GetModuleHandle(NULL), cmdline, MAX_PATH);
   *(wcsrchr(cmdline, L'\\')+1) = '\0'; // ====== ноль вместо последнего слеша;
    wcscat(cmdline, folder_name.c_str());// --- Закончим путь в wchar_t
 
if (_waccess(cmdline, 0) != 0){
        
create_fld(cmdline);
 
    }//         А если есть, то х в неё.
Я вижу что всё это криво.... Переделывать надо...
0
Злостный нарушитель
 Аватар для Verevkin
10264 / 5688 / 1266
Регистрация: 12.03.2015
Сообщений: 26,377
18.09.2025, 18:08
Цитата Сообщение от Наталья8 Посмотреть сообщение
И как преобразовывать между типами. String и std::string?
Не знаю.

0
 Аватар для Наталья8
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,914
18.09.2025, 18:21
Ну спасибо...

C++
1
2
3
4
 String folder_name;
 SYSTEMTIME st;  //                     Подготовка путю и сохранение картинки в   ПАПКУ с датой    (ВЫРЕЗАНИЕ из screen)
    GetSystemTime(&st);
    folder_name = String(st.wDay) + "." + String(st.wMonth) + "." + String(st.wYear); // Имя папки в wchar_t
Я это на XE3 писал... Давно. Переставил конструктор... Но то же самое...
0
Злостный нарушитель
 Аватар для Verevkin
10264 / 5688 / 1266
Регистрация: 12.03.2015
Сообщений: 26,377
18.09.2025, 18:24
Цитата Сообщение от Наталья8 Посмотреть сообщение
Ну спасибо...
Я в С++ не шарю. Пиши на Delphi.
0
 Аватар для Наталья8
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,914
19.09.2025, 02:23
Бильдер C++ 11-17 стандартный поддерживает.
Я на них и напишу. Будет работать. Зачем мне Delphi.?.
Есть разница... Delphi / C++...
Pascal столетний + бильдер (классы). Вообще ни чё не понятно...

--------
Что за манера на бильдере? Хренак мессагу... Виндовс больше не доступна.
Мессага ни как не выключаеться. Только кнопочкой выключения компьютера.

Добавлено через 4 часа 52 минуты
C++
1
2
3
4
5
6
7
8
9
//----------------
    SYSTEMTIME st;  // Название папки сегодняшним числом
    GetSystemTime(&st);
    std::wstring folder_name = std::to_wstring(st.wDay) + L"." + std::to_wstring(st.wMonth) +
        L"." + std::to_wstring(st.wYear); // Имя папки в wchar_t
                                      //----------------
    GetModuleFileNameW(GetModuleHandle(NULL), cmdline, MAX_PATH);
    *(wcsrchr(cmdline, '\\') + 1) = '\0';
    wcscat(cmdline, folder_name.c_str());//

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//----------------
    if (_waccess(cmdline, 0) != 0) {
        CreateDirectoryW(cmdline, NULL); // создаём папку (если сегодняшней нет)
    }//         А если есть, то ху в неё.
   String Name_fld(cmdline);
   String Name=Name_fld+"\\NewPicture";//<== путь в каталог экзешника
int number=1;
while (FileExists(Name+IntToStr(number)+".png"))
{
number++;
}
 
Png->SaveToFile(Name+IntToStr(number)+".png");//<== и создаём файл .JPG
  delete Png;// JPN=NULL;
                          }//--создать не нулевой .JPG
DrawSelectRegion = false;
}
Переделал... Програмка хорошая. Жалко.
Я ей скриншоты режу. И по просмотру она... И webp показывает.
0
 Аватар для Наталья8
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,914
19.09.2025, 02:41
Название: final_file.gif
Просмотров: 98

Размер: 94.4 Кб
Вот такая вот... Формочка. На шестом бильдере изобретал.
0
Злостный нарушитель
 Аватар для Verevkin
10264 / 5688 / 1266
Регистрация: 12.03.2015
Сообщений: 26,377
19.09.2025, 08:09
Цитата Сообщение от Наталья8 Посмотреть сообщение
Бильдер C++ 11-17 стандартный поддерживает.
Я на них и напишу. Будет работать. Зачем мне Delphi.?.
Штоп я смог отвечать на твои вопросы.
0
 Аватар для Наталья8
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,914
19.09.2025, 18:08
Бильдер... Переставлял местами операторы, по програмному смыслу вроде без толку..
Добивался корректной работы открыть фолдер...
(Одну папку, не две не три)
Проведение нажатой п.к.м. по той зелёной штуке.
(Можно на бильдере делать чудеса, среди глюков...)

Добавлено через 2 часа 44 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y) {
          if(one && open_folder) {
     
if (_waccess(cmdline, 0) == 0)
       {    one=false;
     //String rtg = String(wcslen(cmdline));
 ShellExecuteW(NULL, L"explore", cmdline, NULL, NULL,SW_SHOWNORMAL);
 //ShellExecute(0,0,Application->ExeName.c_str(),0,0,SW_SHOW); //Запускаем новую копию
  //Application->Terminate();
       }
      }
 }
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
 if(Button == mbRight) open_folder = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseLeave(TObject *Sender)
{
open_folder = false;  one=true;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2025, 18:08
Помогаю со студенческими работами здесь

как вернуть HBITMAP у Graphics::TBitmap
Добрый вечер! Есть функция вставляющая картинки в видео по их хэндлу: HRESULT AddAviFrame(HAVI...

Как повернуть TBitmap или TImage
начал делать игру на билдере и сразу появился такой вопрос)

TBitmap\TPaintBox ошибки violation error
Подскажите как правильно юзать битмап\пейнтбокс. Вот на такое у меня BCB 6.0 выдаёт violation...

Скорость прорисовки TBitmap в C++ Builder
Есть у меня объект TBitmap, и TImage, на котором нужно прорисовать этот TBitmap после некоторых...

Из TJPEGImage в TBitmap
Доброго времени суток!!! Использую класс TJPEGImage для загрузки *.jpg картинок в проект. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru