Модераторы: 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   Вверх
RinOSpro
Дата 7.9.2007, 11:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Snowy @ 7.9.2007,  10:29)
Да, использовал замену от KOL (компилировать из коммандной строки)

Я эту библиотеку скачал а что дальше....
Дайте пожалуста пример использования пожалуста
  Вверх
Snowy
Дата 7.9.2007, 11:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Держи комплект для компиляции из коммандной строки

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


Unregistered











Еще раз спасибо!!!
  Вверх
RinOSpro
Дата 7.9.2007, 12:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я всетаки подумаю над тем как конвертировать сразу из памяти не записывая на диск.
  Вверх
RinOSpro
Дата 10.9.2007, 10:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что то сложно.
Snowy  Ссылку можно где ты этот пример брал.
  Вверх
Alexeis
Дата 10.9.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(RinOSpro @  10.9.2007,  10:28 Найти цитируемый пост)
Snowy  Ссылку можно где ты этот пример брал. 

Http://Мозг/Серое вещество.ru

Это ж специально для тебя написано. Мало кто заморачивается размерами если они до мегабайта smile


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

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

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


Амеба
Group Icon


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

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



Подправил пример Snowy, теперь делает и скриншоты

Код

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;
  function GdipCreateBitmapFromHBITMAP(hbm: HBITMAP; hpal: HPALETTE;
                                       out bitmap: Pointer): GPSTATUS; stdcall;
   function GdipDisposeImage(image: GPIMAGE): GPSTATUS; stdcall;                                     
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 GdipCreateBitmapFromHBITMAP; external WINGDIPDLL name 'GdipCreateBitmapFromHBITMAP';
function GdipDisposeImage; external WINGDIPDLL name 'GdipDisposeImage';

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.


Код

Program shot;
uses
  Windows, PngGDIP in 'PngGDIP.pas';
var
  token: dword;
  input: TGdiplusStartupInput;
  image: GPIMAGE;
  Clsid: TGUID;
  hBMP   : HBITMAP;
  oldObj : HGDIOBJ;
  DESCDC : HDC;
  memDC  : HDC;
  Width  : Integer;
  Height : Integer;
begin
  Height := GetSystemMetrics(SM_CYSCREEN);
  Width  := GetSystemMetrics(SM_CXSCREEN);
  DESCDC := GetDC(GetDesktopWindow());
  memDC  := CreateCompatibleDC(DESCDC);
  hBMP   := CreateCompatibleBitmap(DESCDC, Width, Height);
  oldObj := SelectObject(memDC, hBMP);
  BitBlt(memDC, 0, 0, Width, Height, DESCDC, 0, 0, SRCCOPY);

  image := nil;
  FillChar(input, SizeOf(input), 0);
  input.GdiplusVersion := 1;
  GdiplusStartup(token, @input, nil);
  GdipCreateBitmapFromHBITMAP(hBMP, 0, image);
  GetEncoderClsid('image/png', Clsid);
  GdipSaveImageToFile(image, 'C:\2.png', @ClsId, nil);
  GdipDisposeImage(image);
  GdiplusShutdown(token);

  SelectObject(memDC, oldObj);
  DeleteObject(memDC);
  DeleteObject(hBMP);
  ReleaseDC(GetDesktopWindow(), DESCDC);
end.


Это сообщение отредактировал(а) Alexeis - 10.9.2007, 13:02


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

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

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


Unregistered











Не умничай мозг серое вещество всетаки пример мне дал Snowy  а не ты. А вообще я уже нашел это в MSDN на сях

Код

#include <windows.h>
#include <gdiplus.h>
#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;
}



Добавлено через 4 минуты и 31 секунду
А примерчик то все равно не работает

Добавлено через 5 минут и 7 секунд
сорри это мои кривые руки

Добавлено через 5 минут и 12 секунд
все пашет
  Вверх
ASGDeveloper
Дата 12.9.2007, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

Репутация: нет
Всего: 1



Спрашивается зачем помогать потенциальному трояно-писателю. То ему скриншоты экрана, то конверт в PNG, но чтобы меньше размер exe-шника был. Теперь вот тема в сетях про работу с WinSock. Все это мне очень напоминает создание маленького незаметного трояна. А вам?

http://forum.vingrad.ru/forum/topic-171500.html
http://forum.vingrad.ru/forum/topic-171341.html
PM MAIL   Вверх
RinOSpro
Дата 12.9.2007, 08:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ASGDeveloper  я создаю трояны и сразу отпровляю по адресу [email protected]  smile а если чесно я сейчас никакого трояна не пишу
Да и вообще здесь много топиков было про то как конвертировать bmp -> png or bmp-> jpg на api .
Вот этот топик полностью раскрыл эту тему. и ему прямая дорога в DRKB 4.0 smile
  Вверх
Alexeis
Дата 12.9.2007, 09:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



RinOSpro, я знаю о чем говорю. Если ты чего не видишь то это не значит, что этого нет. Вопросик этот мы обсуждали вместе по асе.


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

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

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


Unregistered











Цитата(Alexeis @ 12.9.2007,  09:03)
Если ты чего не видишь то это не значит, что этого нет. 

В смысле ???  чего не вижу

Добавлено через 1 минуту и 26 секунд
Цитата(Alexeis @ 12.9.2007,  09:03)
Вопросик этот мы обсуждали вместе по асе.

СПАСИБО Snowy   СПАСИБО Alexeis 
  Вверх
ASGDeveloper
Дата 12.9.2007, 13:32 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

Репутация: нет
Всего: 1



Цитата(RinOSpro @  12.9.2007,  08:58 Найти цитируемый пост)
Да и вообще здесь много топиков было про то как конвертировать bmp -> png or bmp-> jpg на api

Тогда зачем было поднимать свой?

И вообще, я не рассматриваю этот топик как единое целое. Я рассматриваю общую Вашу активность на форуме и у меня есть ряд причин сомневаться в Ваших словах. Приведу их:
1) необходимость написания максимального компактного кода
2) для пункта 1 Вы полагаете использовать: WinSock API и KOL.
3) отправка скриншотов по сети (и возможно еще много-чего другого) напоминает попыптку создания создания BackDoor'а (как его не называй - все равно один из типов malware)

Я конечно понимаю, что это злостный оофтопик, но ИМХО это не дело помогать в таком противозаконном деле.

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


Unregistered











Цитата(ASGDeveloper @ 12.9.2007,  13:32)
Да и вообще здесь много топиков было про то как конвертировать bmp -> png or bmp-> jpg на api

Были но не до конца решённые

Добавлено через 7 минут и 40 секунд
Цитата(ASGDeveloper @  12.9.2007,  13:32 Найти цитируемый пост)
необходимость написания максимального компактного кода
 
ты рассуждаешь как Avast если файл меньше 20 кб то подозрения на вирус, троян и т.д. 

но на winapi программа быстрее что ты сделаешь 3 кадра в секунду на vcl что на api 20 числа примерные но всеже


еклмн где написано отправка скреншотов по сети????????   у меня много интересов тот топик где я задовал вопрос  отправка файлов по сети вообще не имеет к этому отношения ок? 

все полный оффтоп ASGDeveloper  ты виноват smile своими безосновательными подозрениями
  Вверх
Alexeis
Дата 12.9.2007, 15:13 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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




M
Alexeis
Модератор: что делает участник это ТОЛЬКО ЕГО личное дело. Если вопрос стоит корректно, а он так и стоит то не должно быть ни каких наездов. 

Темы на форуме создаются не для одного человека. Потому это будет полезно не только для него но и для других людей. Что теперь из-за подозрений темы закрывать? 

Кроме того написание вирусов не запрещено, запрещено вредительство производимое по средством вирусов. 


Это сообщение отредактировал(а) Alexeis - 12.9.2007, 15:14


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

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

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


developer
**


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

Репутация: нет
Всего: 1



Цитата(RinOSpro @  12.9.2007,  14:24 Найти цитируемый пост)
ты рассуждаешь как Avast если файл меньше 20 кб то подозрения на вирус, троян и т.д. 
но на winapi программа быстрее что ты сделаешь 3 кадра в секунду на vcl что на api 20 числа примерные но всеже

Не оправдывайся. (с)

Цитата(Alexeis @  12.9.2007,  15:13 Найти цитируемый пост)

Кроме того написание вирусов не запрещено, запрещено вредительство производимое по средством вирусов. 

Код

Создание, использование и распространение вредоносных программ для ЭВМ (ст. 273 УК)

Статья предусматривает уголовную ответственность за создание программ для ЭВМ или их модификацию, заведомо приводящее к несанкционированному уничтожению, блокированию и модификации, либо копированию информации, нарушению работы информационных систем, а равно использование таких программ или машинных носителей с такими программами. 

Статья защищает права владельца компьютерной системы на неприкосновенность находящейся в ней информации.

Под созданием вредоносных программам в смысле ст. 273 УК РФ понимаются программы специально разработанные для нарушения нормального функционирования компьютерных программ. Под нормальным функционированием понимается выполнение операций, для которых эти программы предназначены, определенные в документации на программу. Наиболее распространенными видами вредоносных программ являются широко известные компьютерные вирусы и логические бомбы.

Под использованием программы понимается выпуск в свет, воспроизведение, распространение и иные действия по их введению в оборот. Использование может осуществляться путем записи в память ЭВМ, на материальный носитель, распространения по сетям, либо путем иной передачи другим лицам.

Уголовная ответственность по этой статье возникает уже в результате создания программы, независимо от того использовалась эта программа или нет. 


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


Unregistered











Код

но на winapi программа быстрее что ты сделаешь 3 кадра в секунду на vcl что на api 20 числа примерные но всеже


Кстати а как можно провести тестирование кто лучше и на сколько кадров.

Добавлено через 23 секунды
???????????????
  Вверх
MetalFan
Дата 13.9.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



ASGDeveloper, не доковыривайся до человека. мне тоже эти темы интересны, так что, значит и я троянописец?
Цитата
Во времена сухого закона милиция нашла у мужика самогонный аппарат.
- Я Вас арестовываю за самогоноварение!
- Так я же не варю!
- Но аппарат же есть!
- Тогда и за изнасилование сажайте!
- А Вы кого то изнасиловали??!!!
- Нет, но аппарат же есть!


Это сообщение отредактировал(а) MetalFan - 13.9.2007, 09:59


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
RinOSpro
Дата 13.9.2007, 10:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Провел я тестирование и получилось что разница в количестве изображений не большая за 10 секунд на моем компе на VCL-90 кадров на API = 110, при разрешение 1024x1280. Притом что на апи еще сжималось в jpeg. а если посмотреть на размер exe VCL - 360 кб API - 6,5 кб.

Выбор очевиден.



Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  Test.rar 13,99 Kb
  Вверх
Страницы: (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.

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


 




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


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

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