Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.134.77.195] |
|
Сообщ.
#1
,
|
|
|
//////////////////////////////////////////////////////////////////////////////// // // **************************************************************************** // * Unit Name : Unit1 // * Purpose : Демо соранения иконки в файл // * Author : Александр (Rouse_) Багель // * Version : 1.00 // **************************************************************************** // unit Unit1; interface uses Windows, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} (* Информация взята вот отсюда: http://myfileformats.com/download.php?url=/files/bmp.zip&id=150&name=BMP struct IconDirectoryEntry { BYTE bWidth; BYTE bHeight; BYTE bColorCount; BYTE bReserved; WORD wPlanes; WORD wBitCount; DWORD dwBytesInRes; DWORD dwImageOffset; }; typedef struct ICONDIR { WORD idReserved; WORD idType; WORD idCount; ICONDIRENTRY idEntries[1]; } ICONHEADER; *) const RC3_ICON = 1; type PIconDirectoryEntry = ^TIconDirectoryEntry; TIconDirectoryEntry = packed record bWidth: Byte; bHeight: Byte; bColorCount: Byte; bReserved: Byte; wPlanes: Word; wBitCount: Word; dwBytesInRes: DWORD; dwImageOffset: DWORD; end; PIconDir = ^TIconDir; TIconDir = packed record Reserved: Word; wType: Word; Count: Word; idEntries: TIconDirectoryEntry; end; procedure TForm1.Button1Click(Sender: TObject); const IconDirSize = SizeOf(TIconDir); IconDirectoryEntrySize = SizeOf(TIconDirectoryEntry); var Icon: HICON; IconInfo: TIconInfo; IconDir: TIconDir; IconDirectoryEntry: TIconDirectoryEntry; IconBuff: array of Byte; IconFile: THandle; ColorInfoHeaderSize, ColorImageSize, MaskInfoHeaderSize, MaskImageSize, Position, WriteSize: DWORD; ColorInfoHeader, ColorImage, MaskInfoHeader, MaskImage: TByteArray; begin // Загружаем иконку Icon := LoadIcon(HInstance, 'MAINICON'); if Icon <> 0 then begin // Получаем информацию о иконке if GetIconInfo(Icon, IconInfo) then try // GetDIBSizes, GetDIB из модуля Graphics // Получаем размер заголовка и изображения цветной картинки GetDIBSizes(IconInfo.hbmColor, ColorInfoHeaderSize, ColorImageSize); // Получаем размер заголовка и изображения картинки - маски GetDIBSizes(IconInfo.hbmMask, MaskInfoHeaderSize, MaskImageSize); // Получаем сам заголовок и цветную картинку GetDIB(IconInfo.hbmColor, 0, ColorInfoHeader[0], ColorImage[0]); // Получаем сам заголовок и картинку - маску GetDIB(IconInfo.hbmMask, 0, MaskInfoHeader[0], MaskImage[0]); // Подготавливаем заголовок иконки // Each icon-resource file starts with an icon directory. The icon directory, // defined as an ICONDIR structure, specifies the number of icons in the // resource and the dimensions and color format of each icon image. with IconDir do begin Reserved := 0; wType := RC3_ICON; Count := 1; end; // Подготавливаем служебную информацию по иконке // The ICONDIRENTRY structure specifies the dimensions and color format for an // icon. The structure has the following form: with IconDir.idEntries do begin bWidth := PBitmapInfoHeader(@ColorInfoHeader[0])^.biWidth; bHeight := PBitmapInfoHeader(@ColorInfoHeader[0])^.biHeight; bColorCount := PBitmapInfoHeader(@ColorInfoHeader[0])^.biBitCount * PBitmapInfoHeader(@ColorInfoHeader[0])^.biPlanes; dwBytesInRes := ColorInfoHeaderSize + ColorImageSize + MaskImageSize; dwImageOffset := IconDirSize + IconDirectoryEntrySize; end; // color height includes mono bits with PBitmapInfoHeader(@ColorInfoHeader[0])^ do Inc(biHeight, biHeight); // Имея на руках все необходимые данные, формируем из них иконку SetLength(IconBuff, IconDirSize + IconDirectoryEntrySize + ColorInfoHeaderSize + ColorImageSize + MaskImageSize); // Пишем полученные данные в буффер Position := 0; Move(IconDir, IconBuff[Position], IconDirSize); Inc(Position, IconDirSize); Move(IconDirectoryEntry, IconBuff[Position], IconDirectoryEntrySize); Inc(Position, IconDirectoryEntrySize); Move(ColorInfoHeader[0], IconBuff[Position], ColorInfoHeaderSize); Inc(Position, ColorInfoHeaderSize); Move(ColorImage[0], IconBuff[Position], ColorImageSize); Inc(Position, ColorImageSize); Move(MaskImage[0], IconBuff[Position], MaskImageSize); // Вот и все, осталось сохранить этот буффер в файл IconFile := CreateFile(PChar('c:\test.ico'), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if IconFile <> INVALID_HANDLE_VALUE then try if not WriteFile(IconFile, IconBuff[0], Length(IconBuff), WriteSize, nil) then RaiseLastOSError; FlushFileBuffers(IconFile); finally CloseHandle(IconFile); end else RaiseLastOSError; finally // Освобождаем ресурсы ибо: // GetIconInfo creates bitmaps for the hbmMask and hbmColor members of ICONINFO. // The calling application must manage these bitmaps and delete them when they // are no longer necessary. DeleteObject(IconInfo.hbmColor); DeleteObject(IconInfo.hbmMask); end else RaiseLastOSError; end else RaiseLastOSError; end; end. Автор: Rouse_ Ссылка по теме: Как сохранить иконку в файл имея её хендл |