Графика в Delphi - примеры задач на построение графиков, а также компоненты для графики

Записать содержимое окна OpenGL в BMP файл

Сидят два программера в офисе. Бац - звонок телефонный, на проводе шеф:
- Hу, ребята, чем занимаетесь?
- Козла забиваем!
- В домино играете ?!
- Да неееее - в DOOM!

gr - объект, в канве которого я рисую с помощью OpenGL

bt := TBitmap.Create;
with bt do
begin
Width := gr.Width;
Height := gr.Height;
Canvas.CopyRect(ClientRect, gr.Canvas, gr.ClientRect);
SaveToFile(’e:\bt.bmp’);
Free;
end;
Read more »

Работа с OpenGL - Введение

Лежат два програмиста на берегу моря один дрегому:
- Смотри какие облака.
- Да это они умеют!

Введение

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

Когда я начинал изучение этого, у меня не было ни одного примера использования OpenGL в Delphi, только ворох программ на C и C++, поэтому пришлось начинать с того, чтобы перекладывать эти программы на Delphi. Затем появились и полностью собственные проекты. Моя основная работа связана с преподаванием в вузе, после того, как я включил в учебные курсы изучение основ OpenGL, студенты с моей помощью смогли создать ряд интересных проектов.

Я решил опубликовать некоторые из проектов моей коллекции, озаглавил набор “ЖиЛистая Delphi” и предложил сайту “Королевство Delphi”. На сайте мне предложили дополнить эти проекты серией статей по вопросам использования OpenGL в Delphi. Данная статья является первой статьей этого цикла.

Статьи я предполагаю писать на уровне, доступном для самой широкой аудитории - от новичков в программировании для Windows до умудренных профессионалов. Я постараюсь придерживаться краткости в своих рассуждениях, освещая только суть рассматриваемых вопросов. Многие вопросы, освещаемые здесь, ясно проиллюстрированы в проектах “ЖиЛистой Delphi”.
Read more »

Работа с JPEG-изображениями

Для этих целей в Дельфи предусмотрено два класса TJpegImage и TJpegData. Мы будем использовать первый, он описан в модуле JPEG (его надо подключить в uses).

Теперь попробуем реализовать такую вещь. Сделаем конвертер картинок в формате *.bmp в формат *.jpeg. Для этого нам понадобится такие компоненты: TImage (для просмотра картинок), две кнопки TButton (для открытия диалога выбора картинок и для запуска процесса), TTrackBar (для того чтобы устанавливать качество картинки), TCheckBox (чтобы устанавливать или убирать флаг ” Оттенки серого” ) и TOpenDialog.
Read more »

Подскажите как правильно показать на экpане и сохранить в базе картинку формата JPEG

if Picture.Graphic is TJPegImage then
begin
bs:=TBlobStream.Create(TBlobField(Field),bmWrite);
Picture.Graphic.SaveToStream(bs);
bs.Free;
end
else
if Picture.Graphic is TBitmap then
begin
Jpg:=TJPegImage.Create;
Jpg.CompressionQuality:=…;
Jpg.PixelFormat:=…;
Jpg.Assign(Picture.Graphic);
Jpg.JPEGNeeded;
bs:=TBlobStream.Create(TBlobField(Field),bmWrite);
Jpg.SaveToStream(bs);
bs.Free;
Jpg.Free;
end
else
Field.Clear;

Изменить размер Jpeg и сохранить его в новый файл

В Интернете прошел первый конкурс красоты. Звание Мисс Интернет завоевала девушка В_21399КS.JРG. Поздравляем победительницу!

procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBItmap;
jpg: TJpegImage;
scale: Double;
begin
if opendialog1.execute then
begin
jpg := TJpegImage.Create;
try
jpg.Loadfromfile( opendialog1.filename );
if jpg.Height > jpg.Width then
scale := 50 / jpg.Height
else
scale := 50 / jpg.Width;
bmp:= Tbitmap.Create;
try
{Create thumbnail bitmap, keep pictures aspect ratio}
bmp.Width := Round( jpg.Width * scale );
bmp.Height:= Round( jpg.Height * scale );
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
{Draw thumbnail as control}
Self.Canvas.Draw( 100, 10, bmp );
{Convert back to JPEG and save to file}
jpg.Assign( bmp );
jpg.SaveToFile(ChangeFileext( opendialog1.filename, ‘_thumb.JPG’ ));
finally
bmp.free;
end;
finally
jpg.free;
end;
end;
end;

Как загрузить и отмасштабировать JPEGImage в TImage

try
Image1.Picture.Graphic := nil;
Image1.Picture.LoadFromFile(jpegfile);
except
on EInvalidGraphic do
Image1.Picture.Graphic := nil;
end;
if Image1.Picture.Graphic is TJPEGImage then
begin
TJPEGImage(Image1.Picture.Graphic).Scale := Self.Scale;
TJPEGImage(Image1.Picture.Graphic).Performance := jpBestSpeed;
end;

Работа с JPEG изображением в Delphi

Меня очень часто спрашивают как можно вставить изображение в формате Jpeg в исполняемый модуль или как можно просматривать jpeg-изображения в программе. В этой статье я попробую рассказать и показать на примерах как можно работать со jpeg-изображениями.

Для этих целей в Дельфи предусмотрено два класса TJpegImage и TJpegData. Мы будем использовать первый, он описан в модуле JPEG (его надо подключить в uses).

Теперь попробуем реализовать такую вещь. Сделаем конвертер картинок в формате *.bmp в формат *.jpeg. Для этого нам понадобится такие компоненты: TImage (для просмотра картинок), две кнопки TButton (для открытия диалога выбора картинок и для запуска процесса), TTrackBar (для того чтобы устанавливать качество картинки), TCheckBox (чтобы устанавливать или убирать флаг “Оттенки серого”) и TOpenDialog.
Read more »

Преобразовать JPEG в BMP

uses
JPEG;

procedure JPEGtoBMP(const FileName: TFileName);
var
jpeg: TJPEGImage;
bmp: TBitmap;
begin
jpeg := TJPEGImage.Create;
try
jpeg.CompressionQuality := 100; {Default Value}
jpeg.LoadFromFile(FileName);
bmp := TBitmap.Create;
try
bmp.Assign(jpeg);
bmp.SaveTofile(ChangeFileExt(FileName, ‘.bmp’));
finally
bmp.Free
end;
finally
jpeg.Free
end;
end;

{
CompressionQuality (default 100):
Set a value between 1..100, depending on your need of quality and
image file size. 1 = Smallest file size, 100 = Best quality.
}

Получить или установить разрешение JPEG

procedure GetResJpg(JPGFile: string);
const
BufferSize = 50;
var
Buffer: string;
Index: integer;
FileStream: TFileStream;
HorzRes, VertRes: Word;
DP: Byte;
Measure: string;
begin
FileStream := TFileStream.Create(JPGFile,
fmOpenReadWrite);
try
SetLength(Buffer, BufferSize);
FileStream.Read(buffer[1], BufferSize);
Index := Pos(’JFIF’ + #0$00,buffer);
if Index > 0 then Read more »

Как преобразовать BMP в JPEG

uses
Jpeg, ClipBrd;

procedure TfrmMain.ConvertBMP2JPEG;
// converts a bitmap, the graphic of a TChart for example, to a jpeg
var
jpgImg: TJPEGImage;
begin
// copy bitmap to clipboard
chrtOutputSingle.CopyToClipboardBitmap;
// get clipboard and load it to Image1
Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,
ClipBoard.GetAsHandle(cf_Bitmap), 0);
// create the jpeg-graphic
jpgImg := TJPEGImage.Create;
// assign the bitmap to the jpeg, this converts the bitmap
jpgImg.Assign(Image1.Picture.Bitmap);
// and save it to file
jpgImg.SaveToFile(’TChartExample.jpg’);
end;

Преобразовать BMP в JPEG

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Read more »

Как работать с GIF файлами

из файловов GIF (анимированных) вытаскивает каждую картинку в отдельности, или записывает в отдельный BMP по очереди Для этих программок нужен всеми любимый RX Lib !!!

procedure TForm1.Button4Click(Sender: TObject);
var
i, a: integer;
bm: TBItmap;
begin
a := 0;
bm := TBItmap.Create;
bm.Height := RxGIFAnimator1.Height;
bm.Width := RxGIFAnimator1.Image.Count * RxGIFAnimator1.width;
for i := 0 to RxGIFAnimator1.Image.Count - 1 do
begin
RxGIFAnimator1.FrameIndex := i;
bm.Canvas.Draw(a, 0, RxGIFAnimator1.Image.Frames[i].Bitmap);
a := a + RxGIFAnimator1.Height;
end;
//form1.Canvas.Draw(0,0,bm);
bm.SaveToFile(Edit1.Text + ‘.bmp’);
bm.free;
end;

Как работать с GIF файлами

Этот код, делает следующее, загружаем в листбох список Gif файлов, затем это все дело обьединяетсяв один BMP файл,картинка к картинке, кто знает DirectX поймет для чего это надо (спрайты)

procedure TForm1.Button2Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
ListBox1.Items := opendialog1.Files;
Edit2.Text := inttostr(ListBox1.Items.Count);
end;
end;
Read more »

Получить размер GIF-картинки

type
TImageSize = record
Width: Integer;
Height: Integer;
end;

function ReadGIFSize(Stream: TStream): TImageSize;
type
TGifHeader = record
Signature: array [0..5] of Char;
Width, Height: Word;
end;
var
Header: TGifHeader;
begin
FillChar(Header, SizeOf(TGifHeader), #0);
Result.Width := -1;
Result.Height := -1;
with Stream do
begin
Seek(0, soFromBeginning);
ReadBuffer(Header, SizeOf(TGifHeader));
end;
if (AnsiUpperCase(Header.Signature) = ‘GIF89A’) or
(AnsiUpperCase(Header.Signature) = ‘GIF87A’) then
begin
Result.Width := Header.Width;
Result.Height := Header.Height;
end;
end;
Read more »

Как использовать встроенные в Windows иконки в своём приложении

Сперва необходимо узнать, константы, которые соответствуют определённым иконкам. Все они определены в API unit (windows.pas) в Delphi:

* IDI_HAND
* IDI_EXCLAMATION
* IDI_QUESTION

Следующий пример рисует иконку вопроса на панели:

var
DC: HDC;
Icon: HICON;
begin
DC := GetWindowDC(Panel1.Handle);
Icon := LoadIcon(0, IDI_QUESTION);
DrawIcon(DC, 5, 5, Icon);
ReleaseDC(Panel1.Handle, DC);
end;

Компонент на основе TImageList позволяет использовать в приложении анимированные иконки

unit AnimIcon;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ShellApi, TypInfo;

const
WM_FROMTRAYICON = WM_USER + 59;

type
TIconPlace = (ipAppIcon, ipAppMainFormIcon, ipFormIcon, ipImageCtrl,
ipSysTray);
TOnTimerEventOrder = (First, Second);
TIconPlaceSet = set of TIconPlace;
TTimerEvent = procedure(Sender: TObject) of object;
TAnimIcon = class(TImageList)

private
{ Private declarations }
FIconPlaceSet: TIconPlaceSet;
FEnabled: Boolean;
FInterval: Cardinal;
FNumIco: Integer;
FOnTimer: TTimerEvent;
FImage: TImage;
FAuthor: string;
FTip: string; Read more »

Как показать иконку, ассоциированную с данным типом файла

Приходит программист в магазин. Там продавщица - полная такая тетенька. Программист (меланхолично оглядевшись):
- Бутылку пива и пачку презервативов. Продавщица:
- Это ты девушку охмурить бутылкой пива собрался? Вино надо дорогое покупать…. Программист (отрешенно):
- Да нет. Пиво я выпью, когда она уйдет.

uses
ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
Icon: hIcon;
IconIndex: word;
begin
IconIndex := 1;
Icon := ExtractAssociatedIcon(HInstance,
Application.ExeName, IconIndex);
DrawIcon(Canvas.Handle, 10, 10, Icon);
end;

O сохранении иконок 32х32 в 256-цветном формате

Суть вопроса: я столкнулся с проблемой сохранения полноцветных иконок, когда понадобилось немного изменить имеющиеся у меня для своих программ. Ни родной Image Editor от Delphi6, ни другие редакторы не смогли мне помочь. Могли это делать платные редакторы, но они не для нас. Начав разбираться, я обнаружил, что созданная функцией CreateIconIndirect иконка нормально выглядит, если после создания ее кинуть на форму, однако после записи Icon.SaveToFile иконка обезображивается. Это происходит на стадии записи иконки. Поискав информацию, облазив форумы, я понял, что либо этой проблемой никто не занимался, либо с ней все мирятся и заниматься не хотят, хотя интересующиеся имеются.
Read more »

Преобразование иконок в Gliph-ы

Вот небольшой пример того, как можно загрузить иконку, содержащуюся в файле EXE, в Glyph у SpeedButton, и как очистить этот самый Glyph.

Огорчен, но комментарии в исходном коде на испанском языке.

unit Procs;

interface
uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, StdCtrls, Buttons, ExtCtrls, ShellAPI;

procedure LlenaBoton(boton: TSpeedButton; Programa: string);
procedure LimpiaBoton(boton: TSpeedButton);
Read more »

Получить иконку чужого окна

{
First Start Notepad.exe and run this code:
Starte zuerst Notepad.exe und fьhre dann diesen Code aus:
}

procedure TForm1.Button1Click(Sender: TObject);
var
hwindow : THandle;
H: HIcon;
begin
hwindow := FindWindow(’notepad’,nil);
H := CopyIcon(GetClassLong(hwindow, GCL_HICON ));
DrawIcon(Canvas.Handle, 30, 30, H);
end;

Получение иконки из ICO, EXE, DLL

Процесс получения иконок из .EXE, .DLL или .ICO файлов полностью идентичен. Различие только в том, что в .ICO файле может храниться только одна иконка, а в .EXE и .DLL несколько. Для получения иконок из файлов, в модуле ShellAPI, есть функция:

function ExtractIcon(Inst: THandle; FileName: PChar; IconIndex: Word): HIcon;

где

Inst
указатель на приложение вызвавшее функцию,
FileName
имя файла из которого необходимо получить иконку,
IconIndex
номер необходимой иконки.

Если функция возвращает значение не равное нулю, то в файле есть следующая иконка.

В данном примере в компонент Image1 выводится иконка запущенного файла.
Read more »

Получить иконку файла по ярлыку

{
Comment:
The procedure GetAssociatedIcon, trys via Registry to get the
icon(should work for small and big icons) that is associated with
the files shown in the explorer.

This is not my work. But I want to distribute it to you, because
it was really hard to find a corresonding document.
Thanks SuperTrax.
}

{
Kommentar:
Die Prozedure GetAssociatedIcon versucht uber die Registrierung
das Icon der Datei, wie im Explorer angezeigt, herauszubekommen.
(Sollte fur grosse und kleine funktionieren)

Dies ist nicht mein Werk. Ich mochte es nur fur andere zuganglich
machen, weil ich sehr lange gebraucht habe, um ein entsprechendes
Dokument zu finden.
}
Read more »

Извлечь основную иконку EXE-файла

procedure TForm1.Button1Click(Sender: TObject);
var
Icon: TIcon;
FileInfo: SHFILEINFO;
begin
Icon := TIcon.Create;
try
// Get the Icon
SHGetFileInfo(PChar(’Filename.exe’), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON);
icon.Handle := FileInfo.hIcon;

DestroyIcon(FileInfo.hIcon);
// Save the Icon to a file:
icon.SaveToFile(’IconFromExe.ico’);
// Set the Icon as Application Icon (temporary)
Application.Icon := icon;

finally
Icon.Free;
end;
end;

Извлечь иконку

Функция ExtractIcon позволяет извлечь иконку из exe, dll и ico-файлов. Если указанная иконка отсутствует, функция возвращает 0. Количество иконок, содержащихся в файле, можно узнать, указав в качестве последнего параметра –1.

uses ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
ic: TIcon;
i, count: integer;
w: integer;
begin
if OpenDialog1.Execute = false then
Exit;
Form1.Canvas.FillRect(Form1.Canvas.ClipRect);
count := ExtractIcon(Application.Handle,
PChar(OpenDialog1.FileName), -1);
ic := TIcon.Create;
w := Form1.Width div 32;
for i := 0 to count - 1 do
begin
ic.Handle := ExtractIcon(Application.Handle,
PChar(OpenDialog1.FileName), i);
Form1.Canvas.Draw(32 * (i mod w), 32 * (i div w), ic);
end;
ic.Destroy;
end;

Сравнить две иконки

function IconsAreEqual(const Icon1, Icon2: TIcon): Boolean;
var
ms1: TMemoryStream;
ms2: TMemoryStream;
begin
Result := False;
ms1 := TMemoryStream.Create;
try
Icon1.SaveToStream(ms1);
ms2 := TMemoryStream.Create;
try
Icon2.SaveToStream(ms2);
if ms1.Size = ms2.Size then
// Compare the streams, Streams vergleichen:
Result := CompareMem(ms1.Memory, ms2.Memory, ms1.Size)
finally
ms2.Free
end
finally
ms1.Free
end
end;
Read more »

Изменять иконку приложения или окна во время его работы

А мне постоянно хочется передвинуть иконки телеканалов подалье в игол, чтобы не мешались :))) а иногда floating для них выключить.

Изменять иконку приложения или окна достаточно просто - для этого у TApplication и TForm предусмотрено свойство Icon. Смена иконки может вестись обычным присвоением свойству Icon нового значения:

Form1.Icon := Image1.Picture.Icon;

При этом происходит не присвоение указателя (как казалось бы), а копирование данных посредством вызова Assign, который производится в методе TForm.SetIcon

Загрузка иконки из ресурса

Загрузка производится типовым вызовом API:

Form1.Icon.Handle := LoadIcon(hInstance, ‘имя иконки в ресурсе’);

Read more »

Анимированная иконка приложения

Увидев анимацию на форме, мы не удивимся, но сейчас нам предстоит освоить более сложную технологию: мы попытаемся анимировать иконку приложения, ту самую, которая находится на панели задач на кнопке нашего exe-файла!

Сначала нужно будет создать каждый кадр потенциального анимационного клипа. Для этого запустим утилиту “Image Editor”, которая в ходит в стандартный пакет Delphi. Запустить её можно одноимённой командой из меню Tools[инструменты]. Там создаём несколько bmp-файлов размером 16х16.

После чего возвращаемся в Delphi и выносим на форму компонент класса TImageList, дважды щёлкаем на нём и с помощью кнопки Add последовательно добавляем созданные кадры. В каком порядке изображения будут добавляться, в таком же порядке они затем будут выводится.

Далее выносим таймер[Timer], его свойство Interval устанавливаем в нужное значение[например - 5], и именно через заданное здесь количество миллисекунд будут меняться кадры. По событию OnTimer пишем такой код:
Read more »

Как сделать прозрачным фон текста

Используйте функцию SetBkMode():

procedure TForm1.Button1Click(Sender: TObject);
var
OldBkMode: integer;
begin
with Form1.Canvas do
begin
Brush.Color := clRed;
FillRect(Rect(0, 0, 100, 100));
Brush.Color := clBlue;
TextOut(10, 20, ‘Not Transparent!’);
OldBkMode := SetBkMode(Handle, TRANSPARENT);
TextOut(10, 50, ‘Transparent!’);
SetBkMode(Handle, OldBkMode);
end;
end;

Вывод строковой информации

{
Copyright © 1999 by Delphi 5 Developer’s Guide - Xavier Pacheco and Steve Teixeira
}

unit MainFrm;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Menus;

const
DString = ‘Delphi 5 YES!’;
DString2 = ‘Delphi 5 Rocks!’;

type

TMainForm = class(TForm)
mmMain: TMainMenu;
mmiText: TMenuItem;
mmiTextRect: TMenuItem;
mmiTextSize: TMenuItem;
mmiDrawTextCenter: TMenuItem;
mmiDrawTextRight: TMenuItem;
mmiDrawTextLeft: TMenuItem;
procedure mmiTextRectClick(Sender: TObject);
procedure mmiTextSizeClick(Sender: TObject);
procedure mmiDrawTextCenterClick(Sender: TObject);
procedure mmiDrawTextRightClick(Sender: TObject);
procedure mmiDrawTextLeftClick(Sender: TObject);
public
procedure ClearCanvas;
end;
Read more »

Как вывести на Canvas надпись под углом

{Create a rotated font based on the font object F}
function CreateRotatedFont(F : TFont; Angle : Integer) : hFont;
var
LF: TLogFont;
begin
FillChar(LF, SizeOf(LF), #0);
with LF do
begin
lfHeight := F.Height;
lfWidth := 0;
lfEscapement := Angle*10;
lfOrientation := 0;
if fsBold in F.Style then
lfWeight := FW_BOLD
else
lfWeight := FW_NORMAL;
lfItalic := Byte(fsItalic in F.Style);
lfUnderline := Byte(fsUnderline in F.Style);
lfStrikeOut := Byte(fsStrikeOut in F.Style);
lfCharSet := DEFAULT_CHARSET;
StrPCopy(lfFaceName, F.name);
lfQuality := DEFAULT_QUALITY;
{everything else as default}
lfOutPrecision := OUT_DEFAULT_PRECIS;
lfClipPrecision := CLIP_DEFAULT_PRECIS;
case F.Pitch of
fpVariable: lfPitchAndFamily := VARIABLE_PITCH;
fpFixed: lfPitchAndFamily := FIXED_PITCH;
else
lfPitchAndFamily := DEFAULT_PITCH;
end;
end; Read more »

Powered WP Ъ скачать delphi, delphi 7, скачать delphi 7, delphi файлы, delphi, компоненты, delphi 2009, delphi программы, delphi бесплатно, delphi скачать, бесплатно работа delphi, delphi создание, delphi строки, программирования delphi, borland delphi, delphi формы