Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > GDI+ Загрузить bmp


Автор: The Thing 6.7.2006, 12:09
Привет! Никогда не ииспользовал GDI+, всю жизнь работал только с АПИ.. и вот - понадобился!
Помогите пожалуйста примерчиком загрузки картинки (разных формато.. какие сможете дать) с помощью GDI+.
А лучше всего, если есть урлка с описанием или книжкой про GDI+ (если не будет.. просто GDI).. что бы я почитал!

У кого есть примерчики скиньте.. плиз.. 
  

Автор: The Thing 6.7.2006, 12:32
пардон... разве ето ни есть работа с GDI? Так а чем она отличается от GDI+? Что-то я запутался.. помогите.. объясните:
1. С чем я работал?
2. Что такое GDI?
3. Чем отличается GDI+ от GDI?

Код

CDC cdc;
        CBitmap bitmap;
        cdc.CreateCompatibleDC(&dc);
        bitmap.CreateCompatibleBitmap(&dc,    lengthdraw, heigth);

        cdc.SelectObject(bitmap);
        cdc.BitBlt(0, 0, lengthdraw, heigth, &cdc, 0, 0, BLACKNESS);

        ////////////////////////////////////////////////////////////        
        //Draw PreObod
        CPen penPreObod, *oldPen;
        penPreObod.CreatePen(PS_SOLID, FOTO_OBODOK, RGB(255, 255, 255));
        oldPen = cdc.SelectObject(&penPreObod);
 

Автор: vvpC 6.7.2006, 12:53
Цитата(The Thing @  6.7.2006,  12:32 Найти цитируемый пост)
1. С чем я работал?

История об этом умалчивает smile, а приведенный тобой пример это GDI обернутый в MFC
Цитата(The Thing @  6.7.2006,  12:32 Найти цитируемый пост)
2. Что такое GDI?

графический интерфейс устройства
Цитата(The Thing @  6.7.2006,  12:32 Найти цитируемый пост)
3. Чем отличается GDI+ от GDI?

Хотя бы тем что позволяет делать то что не позволяет делать GDI - например загружать и сохранять изображения во многих популярных форматах, а не только в bmp..
Кстати еще можно в MSDN заглянуть:
Код

#define UNICODE
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;

VOID OnPaint(HDC hdc)
{
   Graphics graphics(hdc);
   Pen      pen(Color(255, 0, 0, 255));
   graphics.DrawLine(&pen, 0, 0, 200, 100);
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
   HWND                hWnd;
   MSG                 msg;
   WNDCLASS            wndClass;
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR           gdiplusToken;
   
   // Initialize GDI+.
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   
   wndClass.style          = CS_HREDRAW | CS_VREDRAW;
   wndClass.lpfnWndProc    = WndProc;
   wndClass.cbClsExtra     = 0;
   wndClass.cbWndExtra     = 0;
   wndClass.hInstance      = hInstance;
   wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
   wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
   wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndClass.lpszMenuName   = NULL;
   wndClass.lpszClassName  = TEXT("GettingStarted");
   
   RegisterClass(&wndClass);
   
   hWnd = CreateWindow(
      TEXT("GettingStarted"),   // window class name
      TEXT("Getting Started"),  // window caption
      WS_OVERLAPPEDWINDOW,      // window style
      CW_USEDEFAULT,            // initial x position
      CW_USEDEFAULT,            // initial y position
      CW_USEDEFAULT,            // initial x size
      CW_USEDEFAULT,            // initial y size
      NULL,                     // parent window handle
      NULL,                     // window menu handle
      hInstance,                // program instance handle
      NULL);                    // creation parameters
      
   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);
   
   while(GetMessage(&msg, NULL, 0, 0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   
   GdiplusShutdown(gdiplusToken);
   return msg.wParam;
}  // WinMain

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
   WPARAM wParam, LPARAM lParam)
{
   HDC          hdc;
   PAINTSTRUCT  ps;
   
   switch(message)
   {
   case WM_PAINT:
      hdc = BeginPaint(hWnd, &ps);
      OnPaint(hdc);
      EndPaint(hWnd, &ps);
      return 0;
   case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
   default:
      return DefWindowProc(hWnd, message, wParam, lParam);
   }
}
  

Автор: The Thing 6.7.2006, 13:01
Что-то у меня этой библиотеки не находит...smile  gdiplus.h

Стандартный набор: CPen, CBrush, CFont... это же GDI?

Добавлено @ 13:04 
Да, я использую Вижуал 6. он ГДИ+ юзает? 

Автор: vvpC 6.7.2006, 13:26
Цитата(The Thing @  6.7.2006,  13:01 Найти цитируемый пост)
Стандартный набор: CPen, CBrush, CFont... это же GDI?

HPEN, HBRUSH, HFONT - это GDI. А CPen, CBrush, CFont..это классы-обертки из MFC Ну можно сказать что это тоже GDI.
Цитата(The Thing @  6.7.2006,  13:01 Найти цитируемый пост)
Да, я использую Вижуал 6. он ГДИ+ юзает? 

в стандартном виде конечно нет. Можно попытаться руцами подключить GDI+,  но я бы поставил студию от 2003 или выше.   

Автор: The Thing 6.7.2006, 17:14
Цитата(vvpC @ 6.7.2006,  13:26)
Цитата(The Thing @  6.7.2006,  13:01 Найти цитируемый пост)
Стандартный набор: CPen, CBrush, CFont... это же GDI?

HPEN, HBRUSH, HFONT - это GDI. А CPen, CBrush, CFont..это классы-обертки из MFC Ну можно сказать что это тоже GDI.
Цитата(The Thing @  6.7.2006,  13:01 Найти цитируемый пост)
Да, я использую Вижуал 6. он ГДИ+ юзает? 

в стандартном виде конечно нет. Можно попытаться руцами подключить GDI+,  но я бы поставил студию от 2003 или выше.

Съездил в центер и нарезал студию! smile

Отлично! Как раз с этого я и начинал! Я думал - то просто АПИшный функции для работы с графикой! smile 

Автор: vvpC 6.7.2006, 18:02
Цитата(The Thing @  6.7.2006,  17:14 Найти цитируемый пост)
Я думал - то просто АПИшный функции для работы с графикой!
Так это и есть апишные функции работы с графикой. Только этот API - Windows XP API. более ранние винды надо конкретно апгрейдить.
 

Автор: The Thing 6.7.2006, 18:36
У меня в задании стоит загрузить картинку с помощью GDI+. Я могу ее загрузить таким способом?
Если нет, Приведите... плз!.. правильный!!!..

Код

    hBitmapPole = (HBITMAP)::LoadImage(NULL, "pic.bmp", IMAGE_BITMAP, 0,0,
        LR_DEFAULTCOLOR | LR_DEFAULTSIZE | LR_LOADFROMFILE);

    GetObject(hBitmapPole , sizeof(m_bitmapPole), &m_bitmapPole);
    
    if(!hBitmapPole)
        return false;
 

Автор: Earnest 7.7.2006, 06:16
Есть класс CImage, у него функция LoadXXX - загружает кучу форматов.
А то, что ты написал, это "просто" GDI, но тоже правильно (вроде). 

Автор: vvpC 7.7.2006, 08:34
Цитата(The Thing @  6.7.2006,  18:36 Найти цитируемый пост)
У меня в задании стоит загрузить картинку с помощью GDI+. 
 Если нужен именно GDI+ то твой пример преподу не понравится. Да и использование класса CImage, по этой же причине, тоже не подойдет..
глянь MSDN там все понятно и даны подробные примеры. Вот один из них:
Код

Image image(L"Grapes.jpg");
graphics.DrawImage(&image, 60, 10);

Разве сложно? smile
 

Автор: The Thing 7.7.2006, 09:53
Всем спасиба!

Нашел и прочитал доку по GDI+ (rsdn)... как с ней работать... Жаль, что SDK Documentation нет.. надо бы достать...

Все вышеперечисленные вопросы отпали.. кроме одного

Разумеется, выигрывая в качестве, проигрываешь в скорости, поэтому при использовании режима с наивысшим качеством InterpolationModeHighQualityBicubic медленные компьютеры могут выводить изображения больших размеров в течение нескольких секунд! Но только этот метод способен адекватно отображать картинку при уменьшении ее до 25 процентов (и менее) от оригинала. Этот режим очень поможет различным автоматическим генераторам иконок (thumbnail) изображений в ASP.NET.

Пытаюсь найти как воспользоваться InterpolationModeHighQualityBicubic.

Кто знает помогите!

Добавлено @ 09:55 
Метод нашел.. Graphics::SetInterpolationMode(InterpolationModeHighQualityBicubic); 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)