Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2012, 01:50   #1
nik2009nik
 
Регистрация: 11.02.2012
Сообщений: 6
По умолчанию отображение JPEG на WINAPI

Доброго времени суток!
Программирую на CodeBlocks На чистом WinAPI.
Мне необходимо просто отобразить JPEG картинку в своем приложении.

Очень долго искал в интернете, нашел много способов, но ни один из нх не подошел для COdeBlocks.

Например, нашел реализацию с использованием OleLoadPicture, но в том описании используется тип CComPtr, заголовочный файл для которого отсутсвует в данной среде разработки.
В том же описании используют функцию FileToStream, для которой тоже нет заголовочного файла.

Было описание способа через GDI+. Нашел в интернете заголовочные файлы,lib,dll,залинковал, но при компиляции ругается на отсутствие объявления какой-то переменной.

Были варинаты с IJL, но в скачанном архиве куча файлов и никакой документации по использованию.

Также много примеров находил для классов MFC,VCL и т.д., которые отсутствуют в CodeBlocks.

Подскажите, пожалуйста, желательно ОЧЕНЬ ПОДРОБНО, как реализовать загрузку JPEG на форму средствами WinAPI и стандартными заголовочными файлами и библиотеками.
Либо сторонними библиотеками. Вообще, ЛЮБЫМ ДОСТУПНЫМ СПОСОБОМ, который будет работать в CodeBlocks (и WinAPI).

Последний раз редактировалось nik2009nik; 11.02.2012 в 02:09. Причина: Добавление текста к вопросу
nik2009nik вне форума Ответить с цитированием
Старый 29.09.2012, 12:54   #2
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Хочу поднять актуальную для себя тему что бы не создавать новую. Как на WinApi загрузить JPEG ? (DELPHI)
Lauri вне форума Ответить с цитированием
Старый 29.09.2012, 17:54   #3
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Или PNG. Прочитал кучу материала, но так и не нашёл ответ.
Lauri вне форума Ответить с цитированием
Старый 29.09.2012, 19:14   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

есть готовые библиотеки для работы с jpeg'ом, можно средствами gdi+, ну или раскурить сам формат и грузить его вручную...
counter вне форума Ответить с цитированием
Старый 29.09.2012, 19:22   #5
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
есть готовые библиотеки для работы с jpeg'ом, можно средствами gdi+, ну или раскурить сам формат и грузить его вручную...
Можно подробнее? Мне подойдёт даже вариант конверта из jpeg to bmp, главное средствами winapi. А то всё что нахожу возможно рабочее, но для VCL Задача отобразить картинку в программе, но BMP слишком жирная, использовать крайне не удобно
Lauri вне форума Ответить с цитированием
Старый 29.09.2012, 19:44   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
counter вне форума Ответить с цитированием
Старый 29.09.2012, 20:57   #7
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
К сожалению не знаю Си

Код:
#include <stdio.h>
using namespace Gdiplus;

INT GetEncoderClsid(const WCHAR* format, CLSID* pClsid);  // helper function

INT main()
{
   // Initialize GDI+.
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR gdiplusToken;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

   CLSID   encoderClsid;
   Status  stat;
   Image*   image = new Image(L"Bird.bmp");

   // Get the CLSID of the PNG encoder.
   GetEncoderClsid(L"image/png", &encoderClsid);

   stat = image->Save(L"Bird.png", &encoderClsid, NULL);

   if(stat == Ok)
      printf("Bird.png was saved successfully\n");
   else
      printf("Failure: stat = %d\n", stat); 

   delete image;
   GdiplusShutdown(gdiplusToken);
   return 0;
}
Из информации по ссылке нашёл пример конверта bmp to png, помогите в делфи перевести, ведь на этом примере можна проделать как раз jpeg to bmp
Lauri вне форума Ответить с цитированием
Старый 02.10.2012, 22:52   #8
Exception
Пользователь
 
Регистрация: 31.12.2007
Сообщений: 37
По умолчанию

Я делаю так...

Код:
const
  IMAGE_RCDATA = 1;
  IMAGE_PNG    = 2;
  IMAGE_GIF    = 3;
  IMAGE_JPEG   = 4;
Код:
function GdipLoadImage(const hinst: HINST; lpszName: LPWSTR; uType: UINT; fuLoad: UINT): HBITMAP;
const
  TYPE_PNG : LPWSTR = 'PNG';
  TYPE_GIF : LPWSTR = 'GIF';
  TYPE_JPEG: LPWSTR = 'JPEG';
var
  hRes     : HRSRC;
  dwResSize: DWORD;
  hResLoad : HGLOBAL;
  lpResLock: Pointer;
  hMem     : HGLOBAL;
  pData    : Pointer;
  hr       : HRESULT;
  pStream  : IStream;
  Bitmap   : TGpImage;
  hGlob    : HGLOBAL;
  lpszType : LPWSTR;
  clrBk    : TColorRef;
begin

  Result := 0;

  clrBk := ColorRefToARGB(0);

  if (fuLoad = LR_SHARED) then
  begin

    GdipCreateBitmapFromFile(lpszName, Bitmap);
    if (Bitmap <> nil) then
    try

      GdipCreateHBITMAPFromBitmap(Bitmap, Result, clrBk);

    finally
    // GdipLoadImageFromFile.
      GdipDisposeImage(Bitmap);
    end;

  end
  else
  begin

    case uType of
      IMAGE_RCDATA: lpszType := MAKEINTRESOURCEW(RT_RCDATA);
      IMAGE_PNG   : lpszType := MAKEINTRESOURCEW(TYPE_PNG);
      IMAGE_GIF   : lpszType := MAKEINTRESOURCEW(TYPE_GIF);
      IMAGE_JPEG  : lpszType := MAKEINTRESOURCEW(TYPE_JPEG);
    else
      lpszType := MAKEINTRESOURCEW(RT_BITMAP);
    end;

    hRes := FindResourceW(hinst, lpszName, lpszType);
    if (hRes <> 0) then
    try

      dwResSize := SizeofResource(hinst, hRes);
      if (dwResSize <> 0) then
      try

        hResLoad := LoadResource(hinst, hRes);
        if (hResLoad <> 0) then
        try

          lpResLock := LockResource(hResLoad);
          if (lpResLock <> nil) then
          try

            hMem := GlobalAlloc(GMEM_MOVEABLE, dwResSize);
            if (hMem <> 0) then
            try

              pData := GlobalLock(hMem);
              if (pData <> nil) then
              try

                CopyMemory(pData, lpResLock, dwResSize);
                pStream := nil;
                hr := CreateStreamOnHGlobal(hMem, FALSE, pStream);
                if (hr = S_OK) then
                try

                  GdipLoadImageFromStream(pStream, Bitmap);
                  if (Bitmap <> nil) then
                  try

                    GdipCreateHBITMAPFromBitmap(Bitmap, Result, clrBk);

                  finally
                  // GdipLoadImageFromStream.
                    GdipDisposeImage(Bitmap);
                  end;

                finally
                // CreateStreamOnHGlobal.
                  hr := GetHGlobalFromStream(pStream, hGlob);
                  if (hr = S_OK) then
                    GlobalFree(hGlob);
                  pStream := nil;
                end;

              finally
              // GlobalLock.
              end;

            finally
            // GlobalAlloc.
              GlobalUnlock(hMem);
              GlobalFree(hMem);
            end;

          finally
          // LockResource.
            UnlockResource(HGLOBAL(lpResLock));
          end;

        finally
        // LoadResource.
          FreeResource(hResLoad);
        end;

      finally
      // SizeofResource.
      end;

    finally
    // FindResource.
    end;

  end;

end;
Exception вне форума Ответить с цитированием
Старый 07.10.2012, 03:10   #9
kovalev
 
Аватар для kovalev
 
Регистрация: 06.10.2012
Сообщений: 5
Стрелка

Цитата:
Сообщение от Lauri Посмотреть сообщение
Хочу поднять актуальную для себя тему что бы не создавать новую. Как на WinApi загрузить JPEG ? (DELPHI)
Код:
program Template;

uses
  Windows, Messages, ActiveX;

const
  IID: TGUID = '{7BF80980-BF32-101A-8BBB-00AA00300CAB}';
  HIMETRIC_INCH = 2540;  

var
  WC: TWndClass;
  Msg: TMsg;
  Picture: IPicture = nil;

procedure LoadFile(FileName: String);    // BMP, ICO, GIF, JPG, EMF, WMF
var
  aFile: HFILE;
  Stream: IStream;
  Data: Pointer;
  BytesRead: DWORD;
  FileSize: DWORD;
  Global: HGLOBAL;
begin
  aFile := CreateFile(PChar(FileName), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  FileSize := GetFileSize(aFile, nil);
  Global := GlobalAlloc(GMEM_MOVEABLE, FileSize);
  Data := GlobalLock(Global);
  ReadFile(aFile, Data^, FileSize, BytesRead, nil);
  GlobalUnlock(Global);
  CloseHandle(aFile);
  CreateStreamOnHGlobal(Global, True, Stream);
  OleLoadPicture(Stream, FileSize, False, IID, Picture);
  GlobalFree(Global)
end;

function WinProc(Win, Msg, WP, LP: Integer): Integer; stdcall;
var
  PS: TPaintStruct;
  Rect: TRect;
  aWidth, aHeight, bWidth, bHeight: Integer;
begin
  case Msg of

    WM_CREATE: LoadFile('1.jpg');

    WM_PAINT:
    begin
      BeginPaint(Win, PS);
      Picture.get_Width(aWidth);
      Picture.get_Height(aHeight);
      bWidth  := MulDiv(aWidth,  GetDeviceCaps(PS.hDC, LOGPIXELSX), HIMETRIC_INCH);
      bHeight := MulDiv(aHeight, GetDeviceCaps(PS.hDC, LOGPIXELSY), HIMETRIC_INCH);
      GetClientRect(Win, Rect);
      Picture.Render(PS.hDC, 0, 0, bWidth, bHeight, 0, aHeight, aWidth, -aHeight, Rect);
      EndPaint(Win, PS);
    end;

    WM_DESTROY:
      PostQuitMessage(0)

  end;
  Result := DefWindowProc(Win, Msg, WP, LP)
end;

BEGIN
  with WC do
  begin
    lpszClassName := 'asd';
    lpfnWndProc :=  @WinProc;
    hbrBackground := 1;
    hCursor := LoadCursor(0, IDC_ARROW)
  end;
  RegisterClass(WC);

  CreateWindow(WC.lpszClassName, 'Заголовок программы',
    WS_OVERLAPPED or WS_SYSMENU or WS_MINIMIZEBOX or WS_VISIBLE,
    400, 300, 250, 217, 0, 0, hInstance, nil);

  while GetMessage(Msg, 0, 0, 0) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg)
    end;
END.
kovalev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение картинки в C++ в формате jpeg, используя "путь" записанный в базе данных типа Access Gared Помощь студентам 0 15.05.2011 17:29
Jpeg warmbabe Общие вопросы по Java, Java SE, Kotlin 2 26.02.2010 20:14
Отображение jpeg в StringGrid WhistleR Компоненты Delphi 5 05.10.2009 10:42
Отображение скрытых файлов и папок и отображение розширения всех файлов beegl Общие вопросы Delphi 10 14.12.2008 22:02
jpeg All517 БД в Delphi 15 22.11.2007 14:31