Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/64: Рейтинг темы: голосов - 64, средняя оценка - 4.77
87 / 64 / 2
Регистрация: 04.01.2010
Сообщений: 265
1

PNG\JPG через WinAPI

22.06.2011, 16:27. Показов 11923. Ответов 12
Метки нет (Все метки)

День добрый!

Подскажите, пожалуйста, какие функи надобно использовать, дабы зная имя png\jpg файла загрузить их в hBitMap. Если можно с примером, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2011, 16:27
Ответы с готовыми решениями:

Сохранение изображения jpg/png в базу данных средствами С++ и WinAPI с последующим извлечением оного из БД
Можно ли с использованием C++ на winApi сохранить изображение (png,jpeg) в какую нибудь переменную...

jpg формат в WinAPI
Возможно на кнопку установить рисунок с расширением jpg???

[Си] WinApi, отрисовка png файла
Доброго времени суток! Пишу проект на чистом Си (принципиально) с использованием WinApi. Возникла...

Преобразовать hbitmap в jpeg/png winapi
У меня есть снимок экрана, который содержится в hbitmap. Можно ли его преобразовать в jpeg/png...

12
2822 / 1631 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
22.06.2011, 18:20 2
Можно через GDI+
http://msdn.microsoft.com/en-u... 36295.aspx
Только если использовать GDI+, нужен ли тогда этот HBITMAP вообще?
0
87 / 64 / 2
Регистрация: 04.01.2010
Сообщений: 265
22.06.2011, 18:39  [ТС] 3
Не совсем понял, что она дает - hBitMap от Color?
нужен ли тогда этот HBITMAP вообще?
Если отказаться от hBitMap и полностью перейти на GDIobject`ы, придется всю систему переписывать заново - а это около года разработки. Поэтому проще написать "переходник" от файлов типа png и jpg в 32-х битный hBitMap.
0
PB
Просто прогер
1286 / 1073 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
22.06.2011, 18:50 4
В PureBasic я вот так загружал в нескольких программах.
PureBasic
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Procedure LoadIMG_Mem(*Point, Size, Image)
  Protected ImageID=0
  HGLOBAL    = GlobalAlloc_(#GMEM_MOVEABLE, GIF_Size)
  If HGLOBAL 
    pvData = GlobalLock_(HGLOBAL)
    CopyMemory(*GIF, pvData, GIF_Size)
    GlobalUnlock_(HGLOBAL)  
    
    If CreateStreamOnHGlobal_(HGLOBAL, #True, @pstm.IStream) = #S_OK  
      If OleLoadPicture_(pstm, GIF_Size, #False,?IID_IPicture, @Bild.IPicture) = #S_OK  
        Bild\get_Height(@Height)  
        Bild\get_Width(@Width)  
        
        hDC = GetDC_(GetDesktopWindow_())  
        ScreenPixels_X = GetDeviceCaps_(hDC,#LOGPIXELSX)  
        ScreenPixels_Y = GetDeviceCaps_(hDC,#LOGPIXELSY)  
        ReleaseDC_(GetDesktopWindow_(),hDC)  
        
        PicHeight = (Height * ScreenPixels_X) / 2540  
        PicWidth  = (Width  * ScreenPixels_Y) / 2540  
        
        result = CreateImage(Image,PicWidth,PicHeight)  
        
        If result  
          hDC = StartDrawing(ImageOutput(Image))  
          Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0)  
          StopDrawing()  
        EndIf  
        
        ImageID=result
        
        Bild\Release()    
        pstm\Release() 
      EndIf
    EndIf
  EndIf
  ProcedureReturn ImageID
EndProcedure
 
DataSection
  IID_IPicture:  
       Data.l $7BF80980  
       Data.w $BF32,$101A  
       Data.b $8B,$BB,$00,$AA,$00,$30,$0C,$AB
EndDataSection
Файл с рисунком должен быть предварительно загружен в память.
Процедура грузит многие форматы, BPM, JPG, GIF и др.
PNG к сожалению не загружает.
0
2822 / 1631 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
22.06.2011, 23:47 5
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
#include <windows.h>
#include <gdiplus.h>
 
using namespace Gdiplus;
 
int main()
{
    ULONG_PTR token;
    GdiplusStartupInput input;
    GdiplusStartup(&token, &input, 0);
    {
        Bitmap bitmap(L"file.jpg");
        UINT w = bitmap.GetWidth(), h = bitmap.GetHeight();
        HBITMAP hBmp;
        bitmap.GetHBITMAP(Color(), &hBmp);
        HDC hDc = GetDC(0);
        HDC hDcBitmap = CreateCompatibleDC(hDc);
        HBITMAP hPrevBmp = (HBITMAP)SelectObject(hDcBitmap, hBmp);
        BitBlt(hDc, 0, 0, w, h, hDcBitmap, 0, 0, SRCCOPY);
        SelectObject(hDcBitmap, hPrevBmp);
        DeleteObject(hBmp);
        DeleteDC(hDcBitmap);
        ReleaseDC(0, hDc);
    }
    GdiplusShutdown(token);
}
1
87 / 64 / 2
Регистрация: 04.01.2010
Сообщений: 265
23.06.2011, 09:57  [ТС] 6
gdiplus.h\.pas это хорошо, но без неё никак?
0
2822 / 1631 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
23.06.2011, 12:42 7
Цитата Сообщение от Sophos Посмотреть сообщение
gdiplus.h\.pas это хорошо, но без неё никак?
А что чем не подходит? Если в C, без классов, есть GdiPlusFlat.h, оставшееся - это объектно-ориентированная обёртка вокруг тех функций. Ещё можно посмотреть, что конкретно импортировать, объявить самому - тут не особо много.
Без GdiPlus и IPicture, по-моему, стандартных windowsовских вариантов нет, только через другие библиотеки. Ну, или вручную )
0
87 / 64 / 2
Регистрация: 04.01.2010
Сообщений: 265
23.06.2011, 13:31  [ТС] 8
Ну, или вручную
Именно об этом и веду речь. Подключение модуля gdiplus заставляет разрастись текущий проект в ~15 раз. А нужно то всего лишь загрузить png в hBitMap. Остальные функции не нужны. Да и загрузить данную комбинацию надо скорее для проформы - дабы не ограничивать круг доступных форматов {ico, bmp}.
по-моему, стандартных windowsовских вариантов нет,
Тем не менее, стандартный paint времен XP спокойно использует кучу форматов.
0
4076 / 1791 / 210
Регистрация: 06.10.2010
Сообщений: 4,001
23.06.2011, 17:12 9
https://www.cyberforum.ru/asse... 37976.html
1
2822 / 1631 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
23.06.2011, 20:00 10
Цитата Сообщение от Sophos Посмотреть сообщение
Подключение модуля gdiplus заставляет разрастись текущий проект в ~15 раз
Функции в dll, dll в XP есть. Win меньше XP или что?
0
87 / 64 / 2
Регистрация: 04.01.2010
Сообщений: 265
23.06.2011, 20:06  [ТС] 11
Win меньше XP или что?
Классы в проекте не используются.
0
2822 / 1631 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
23.06.2011, 21:23 12
Если по-быстрому нарезать хедеры GdiPlus, получается что-то такое:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <windows.h>
 
enum Status
{
    Ok = 0,
    GenericError = 1,
    InvalidParameter = 2,
    OutOfMemory = 3,
    ObjectBusy = 4,
    InsufficientBuffer = 5,
    NotImplemented = 6,
    Win32Error = 7,
    WrongState = 8,
    Aborted = 9,
    FileNotFound = 10,
    ValueOverflow = 11,
    AccessDenied = 12,
    UnknownImageFormat = 13,
    FontFamilyNotFound = 14,
    FontStyleNotFound = 15,
    NotTrueTypeFont = 16,
    UnsupportedGdiplusVersion = 17,
    GdiplusNotInitialized = 18,
    PropertyNotFound = 19,
    PropertyNotSupported = 20
};
 
struct GdiplusStartupInput
{
    UINT32 GdiplusVersion;
    void* DebugEventCallback;
    BOOL SuppressBackgroundThread;
    BOOL SuppressExternalCodecs;
};
 
extern "C"
{
    Status __stdcall GdiplusStartup(ULONG_PTR*, const GdiplusStartupInput*, void*);
    void __stdcall GdiplusShutdown(ULONG_PTR);
    Status __stdcall GdipCreateHBITMAPFromBitmap(void*, HBITMAP*, DWORD);
    Status __stdcall GdipLoadImageFromFile(const WCHAR*, void**);
    Status __stdcall GdipGetImageWidth(void*, UINT*);
    Status __stdcall GdipGetImageHeight(void*, UINT*);
    Status __stdcall GdipDisposeImage(void*);
}
 
int main()
{
    ULONG_PTR token;
    GdiplusStartupInput input = {1, 0, FALSE, FALSE};
    GdiplusStartup(&token, &input, 0);
    void* bitmap;
    GdipLoadImageFromFile(L"file.jpg", &bitmap);
    UINT w, h;
    GdipGetImageWidth(bitmap, &w);
    GdipGetImageHeight(bitmap, &h);
    HBITMAP hBmp;
    GdipCreateHBITMAPFromBitmap(bitmap, &hBmp, 0);
 
    HDC hDc = GetDC(0);
    HDC hDcBitmap = CreateCompatibleDC(hDc);
    HBITMAP hPrevBmp = (HBITMAP)SelectObject(hDcBitmap, hBmp);
    BitBlt(hDc, 0, 0, w, h, hDcBitmap, 0, 0, SRCCOPY);
    SelectObject(hDcBitmap, hPrevBmp);
    DeleteObject(hBmp);
    DeleteDC(hDcBitmap);
    ReleaseDC(0, hDc);
 
    GdipDisposeImage(bitmap);
    GdiplusShutdown(token);
}
1
87 / 64 / 2
Регистрация: 04.01.2010
Сообщений: 265
24.06.2011, 11:43  [ТС] 13
Если по-быстрому нарезать хедеры GdiPlus, получается что-то такое:
Ага, то есть возможно. Спасибо, буду разбирать код.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2011, 11:43

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как вывести в окно картинку jpg, png и др. (кроме .bmp) и звук, кроме WAV
Заранее спасибо за рабочий пример!

Объединение нескольких png файлов в один png-файл
В общем надо написать програмулину, которая объединяет несколько png файлов (ширина и высота...

Ввод через WINAPI
Доброго времени суток! Я только осваиваю WinAPI, не судите строго... Создал приложение: wchar_t...

Файловый менеджер через winapi
Вобще задали сделать файловый менеджер. Начали учить winapi недавно. Он должен уметь следующее:...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.