Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> BmpToPng or BmpToJpg in WinAPI 
V
    Опции темы
RinOSpro
Дата 6.9.2007, 13:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Кто ни будь знает каким образом можно конвертировать bmp в png или jpg на чистом winapi без подключения модуля Graphics, и без библиотеки KOL и тому подобных. только c windows.
  Вверх
Snowy
Дата 6.9.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



PM MAIL   Вверх
RinOSpro
Дата 6.9.2007, 14:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Не слаба... это покруче Graphics.pas будет, если в Graphics 6926 строк кода то тут в GDIPAPI - 7015, DirectDraw - 7161, GDIPOBJ - 7991 строк кода. Я конечно понимаю что это все экспортируется из dll. А примерчик есть? Стоит его вообще использовать?
  Вверх
Snowy
Дата 6.9.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



А Windows.pas ещё круче ;-)
Не вес исходняка важен, а результат.
А примерчик по тому же линку есть. Разве не подходит?
PM MAIL   Вверх
RinOSpro
Дата 6.9.2007, 14:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ты че Snowy  Windows.pas  он самый крутой, но без него никуда )).
А этот пример он чтото не работает он не знает что такое TMemoryStream, IStream, и т.д  да много чего он там еще не знает.

Добавлено через 3 минуты и 28 секунд
Цитата(Snowy @ 6.9.2007,  14:30)
Не вес исходняка важен, а результат.

Если бы не важен был вес то я бы не спрашивал а конвертировал с модулем jpeg но этот модуль за собой тянет еще килобайт 50 без учета того что нужны и другие модули
  Вверх
Snowy
Дата 6.9.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(RinOSpro @  6.9.2007,  14:40 Найти цитируемый пост)
Если бы не важен был вес то я бы не спрашивал а конвертировал с модулем jpeg но этот модуль за собой тянет еще килобайт 50 без учета того что нужны и другие модули
Я имею ввиду, что не важен вес исходного кода - важен размер результата.

Пример прост:
Код
Program shot;

uses GDIPOBJ, GDIPUTIL;

var
  encoderClsid: TGUID;
  Image: TGPImage;
begin
   Image := TGPImage.Create('1.bmp');
   GetEncoderClsid('image/png', encoderClsid);
   image.Save('2.png', encoderClsid, nil);
   image.Free;
end.
Минус - эти модули тащут с собой Math, SysUtils, DirectX...
Но по их коду можно вытащить из них только то, что нужно для конверта в png.
При желании от лишнего балласта несложно избавиться.
PM MAIL   Вверх
Snowy
Дата 6.9.2007, 16:46 (ссылка) |   (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Если очень захотеть...
Код
unit PngGDIP;

interface

uses Windows;

const WINGDIPDLL = 'gdiplus.dll';

type
  Status = (
    Ok,
    GenericError,
    InvalidParameter,
    OutOfMemory,
    ObjectBusy,
    InsufficientBuffer,
    NotImplemented,
    Win32Error,
    WrongState,
    Aborted,
    FileNotFound,
    ValueOverflow,
    AccessDenied,
    UnknownImageFormat,
    FontFamilyNotFound,
    FontStyleNotFound,
    NotTrueTypeFont,
    UnsupportedGdiplusVersion,
    GdiplusNotInitialized,
    PropertyNotFound,
    PropertyNotSupported
  );
  TStatus = Status;
  GpStatus          = TStatus;

  ImageCodecInfo = packed record
    Clsid             : TGUID;
    FormatID          : TGUID;
    CodecName         : PWCHAR;
    DllName           : PWCHAR;
    FormatDescription : PWCHAR;
    FilenameExtension : PWCHAR;
    MimeType          : PWCHAR;
    Flags             : DWORD;
    Version           : DWORD;
    SigCount          : DWORD;
    SigSize           : DWORD;
    SigPattern        : PBYTE;
    SigMask           : PBYTE;
  end;
  TImageCodecInfo = ImageCodecInfo;
  PImageCodecInfo = ^TImageCodecInfo;

  GpImage = Pointer;

  DebugEventLevel = (
    DebugEventLevelFatal,
    DebugEventLevelWarning
  );
  DebugEventProc = procedure(level: DebugEventLevel; message: PChar); stdcall;

  GdiplusStartupInput = packed record
    GdiplusVersion          : Cardinal;       // Must be 1
    DebugEventCallback      : DebugEventProc; // Ignored on free builds
    SuppressBackgroundThread: BOOL;           // FALSE unless you're prepared to call
                                              // the hook/unhook functions properly
    SuppressExternalCodecs  : BOOL;           // FALSE unless you want GDI+ only to use
  end;                                        // its internal image codecs.
  TGdiplusStartupInput = GdiplusStartupInput;
  PGdiplusStartupInput = ^TGdiplusStartupInput;

  NotificationHookProc = function(out token: ULONG): Status; stdcall;
  NotificationUnhookProc = procedure(token: ULONG); stdcall;

  GdiplusStartupOutput = packed record
    NotificationHook  : NotificationHookProc;
    NotificationUnhook: NotificationUnhookProc;
  end;
  TGdiplusStartupOutput = GdiplusStartupOutput;
  PGdiplusStartupOutput = ^TGdiplusStartupOutput;

  EncoderParameterValueType = Integer;
  TEncoderParameterValueType = EncoderParameterValueType;
  EncoderParameter = packed record
    Guid           : TGUID;   // GUID of the parameter
    NumberOfValues : ULONG;   // Number of the parameter values
    Type_          : ULONG;   // Value type, like ValueTypeLONG  etc.
    Value          : Pointer; // A pointer to the parameter values
  end;
  TEncoderParameter = EncoderParameter;
  PEncoderParameter = ^TEncoderParameter;
  EncoderParameters = packed record
    Count     : UINT;               // Number of parameters in this structure
    Parameter : array[0..0] of TEncoderParameter;  // Parameter values
  end;
  TEncoderParameters = EncoderParameters;
  PEncoderParameters = ^TEncoderParameters;

  function GdipGetImageEncodersSize(out numEncoders: UINT; out size: UINT): GPSTATUS; stdcall;
  function GdipGetImageEncoders(numEncoders: UINT; size: UINT; encoders: PIMAGECODECINFO): GPSTATUS; stdcall;
  function GdiplusStartup(out token: ULONG; input: PGdiplusStartupInput; output: PGdiplusStartupOutput): Status; stdcall;
  procedure GdiplusShutdown(token: ULONG); stdcall;
  function GdipLoadImageFromFile(filename: PWCHAR; out image: GPIMAGE): GPSTATUS; stdcall;
  function GdipSaveImageToFile(image: GPIMAGE; filename: PWCHAR; clsidEncoder: PGUID; encoderParams: PENCODERPARAMETERS): GPSTATUS; stdcall;
  function GetImageEncodersSize(out numEncoders, size: UINT): TStatus;
  function GetImageEncoders(numEncoders, size: UINT; encoders: PImageCodecInfo): TStatus;
  function GetEncoderClsid(format: String; out pClsid: TGUID): integer;

implementation

function GdipGetImageEncodersSize; external WINGDIPDLL name 'GdipGetImageEncodersSize';
function GdipGetImageEncoders; external WINGDIPDLL name 'GdipGetImageEncoders';
function GdiplusStartup; external WINGDIPDLL name 'GdiplusStartup';
procedure GdiplusShutdown; external WINGDIPDLL name 'GdiplusShutdown';
function GdipLoadImageFromFile; external WINGDIPDLL name 'GdipLoadImageFromFile';
function GdipSaveImageToFile; external WINGDIPDLL name 'GdipSaveImageToFile';

function GetImageEncodersSize(out numEncoders, size: UINT): TStatus;
  begin
    result := GdipGetImageEncodersSize(numEncoders, size);
  end;
  function GetImageEncoders(numEncoders, size: UINT; encoders: PImageCodecInfo): TStatus;
  begin
    result := GdipGetImageEncoders(numEncoders, size, encoders);
  end;
function GetEncoderClsid(format: String; out pClsid: TGUID): integer;
var
  num, size, j: UINT;
  ImageCodecInfo: PImageCodecInfo;
Type
  ArrIMgInf = array of TImageCodecInfo;
begin
  num  := 0; // number of image encoders
  size := 0; // size of the image encoder array in bytes
  result := -1;
  GetImageEncodersSize(num, size);
  if (size = 0) then exit;
  GetMem(ImageCodecInfo, size);
  if(ImageCodecInfo = nil) then exit;
  GetImageEncoders(num, size, ImageCodecInfo);
  for j := 0 to num - 1 do
  begin
    if( ArrIMgInf(ImageCodecInfo)[j].MimeType = format) then
    begin
      pClsid := ArrIMgInf(ImageCodecInfo)[j].Clsid;
      result := j;  // Success
    end;
  end;
  FreeMem(ImageCodecInfo, size);
end;

end.


И вот пример, как сконвертить bmp в png:
Код
Program shot;

uses
  Windows, PngGDIP in 'PngGDIP.pas';

var
  token: dword;
  input: TGdiplusStartupInput;
  image: GPIMAGE;
  Clsid: TGUID;
begin
  image := nil;
  FillChar(input, SizeOf(input), 0);
  input.GdiplusVersion := 1;
  GdiplusStartup(token, @input, nil);
  GdipLoadImageFromFile('1.bmp', image);
  GetEncoderClsid('image/png', Clsid);
  GdipSaveImageToFile(image, '2.png', @ClsId, nil);
  GdiplusShutdown(token);
end.

У меня получился exe 7 кило весом... Просто читает 1.bmp, конвертит и сохраняет в 2.png
прикрепляю exe и код:

Присоединённый файл ( Кол-во скачиваний: 32 )
Присоединённый файл  shot.zip 4,93 Kb
PM MAIL   Вверх
RinOSpro
Дата 7.9.2007, 08:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Snowy СПАСИБО!!! 

Только не пойму как размер exe у тебя 7 кб я скомпилировал у  меня 15 кб
  Вверх
Alexeis
Дата 7.9.2007, 09:31 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



RinOSpro, нужно использовать заменители модулей System и SysInit от KOL и вычистить экзешник от мусора всякими стрипрелоками. И еще похоже он сжат упаковщиком  smile 

Это сообщение отредактировал(а) Alexeis - 7.9.2007, 09:33


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 7.9.2007, 09:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Alexeis  ссылочку на эти модули не дашь?
  Вверх
BaD_SeCt0R
Дата 7.9.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: 3
Всего: 18





--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Alexeis
Дата 7.9.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 7.9.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Нет, 7 кило - это не жатый. Жатый 3 кило.
См - архив 4 кило с исходняками ;-)
Да, использовал замену от KOL (компилировать из коммандной строки)
И прошёлся PEOptimizer'ом
PM MAIL   Вверх
RinOSpro
Дата 7.9.2007, 10:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Snowy  http://forum.vingrad.ru/topic-135258.html вот есть похожий топик. Про Скриншот на Winapi.
Я попробывал их обьеденить и что получилось:
________________________
получить снимок экрана в памяти
записать в файл
открыть это файл
конвертировать
сохранить этот файл
________________________


а можно ли это оптимизировать и сделать примерно так

получить снимок экрана в памяти (понятно что в Hbitmap)
конвертировать (из hbitmap или tbitmap (записать заголовок) в то что нам нужно jpg, png
сохранить этот файл

  Вверх
Snowy
Дата 7.9.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Конечно можно. Но я не настолько силён в GDI+ (а точнее я его вообще не знаю - просто сделал пример по информации из хедеров и MSDN), чтобы вот так вот навскидку выдать решение.
Это нужно ковырять MSDN, а мне сейчас лень  smile 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1033 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.