Работа с JPG в Delphi (библиотека GDI+)

Решил я тут поковыряться в своих прогах, а они отказываются компилиться из за отсутсвия модулей GDIPAPI, GDIPOBJ и GDIPUTIL. Дело в том, что в последних версиях я юзал библиотеку GDI+, которая не установлена ни на одном из обоих ноутов.
Ну установил конечно, а вместе с тем решил, что можно ею поделиться с народом.

Все же представляемая по умолчанию работа только с bmp (в делфи 7) явно устарела.

С самого начала выложу библиотеку. Скачивайте

А теперь пара примеров работы с ней

Сразу скажу, чтобы каждый раз не повторяться. В список модулей (uses) приписывайте три модуля GDIPAPI, GDIPOBJ, GDIPUTIL

Первый пример.

Самое простое. Преобразование туда и обратно.

Преобразование из bmp в jpg

var
encoderClsid: TGUID;
Image: TGPImage;

begin
Image := TGPImage.Create(‘file.bmp’);
GetEncoderClsid(‘image/jpeg’, encoderClsid);
image.Save(‘file.jpg’, encoderClsid, nil);
image.Free;
end.

Преобразование из jpg в bmp

var
encoderClsid: TGUID;
Image: TGPImage;

begin
Image := TGPImage.Create(‘file.jpg’);
GetEncoderClsid(‘image/bmp’, encoderClsid);
image.Save(‘file.bmp’, encoderClsid, nil);
image.Free;
end.

Второй пример.

Именно в таком виде я и юзаю эту библиотеку, поэтому большей частью это будет копипаст с моего доргенчика. Хотя и с изменениями. Так что если будут ошибки пишите.

Изменение размера jpg файла с помощью Delphi.

var
in_img, out_img: TGPImage;
g: TGPGraphics;
out_width, out_height, cou: Integer;
sclx:extended;
fname:string;
encoderClsid: TGUID;

begin
try
fname:=’file.jpg’
out_width :=150;
out_height :=150;
in_img := TGPImage.Create(fname);
sclx:=out_width/in_img.GetWidth;

if sclx < 1 then
begin
out_height :=round(in_img.GetHeight*sclx);
out_img :=TGPBitmap.Create(out_width,out_height);
g := TGPGraphics.Create(out_img);

if  in_img.GetWidth > in_img.getheight then
begin
g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height),
(in_img.GetWidth-in_img.getheight) div 2, 0, in_img.getheight, in_img.GetHeight, UnitPixel);
end  else
g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height),
0, (in_img.getheight-in_img.GetWidth) div 2,  in_img.GetWidth, in_img.GetWidth, UnitPixel);
g.Destroy;
in_img.Free;
GetEncoderClsid(‘image/jpeg’, encoderClsid);
out_img.Save(fname, encoderClsid);
out_img.free;
end;

except end;
end.

На самом деле этот код не просто изменяет размер, он сохраняет пропорции подгоняя картинку в квадратные рамки 150 на 150 и обрезая лишнее, если какая-то сторона длиннее другой. При чем обрезка идет не с одного конца, а пополам с выступающих краев.

__
Для простого масштабирования нужно рассчитать размеры выходного файла и вместо

if  in_img.GetWidth > in_img.getheight then
begin
g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height), (in_img.GetWidth-in_img.getheight) div 2, 0, in_img.getheight, in_img.GetHeight, UnitPixel);
end  else
g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height), 0, (in_img.getheight-in_img.GetWidth) div 2,  in_img.GetWidth, in_img.GetWidth, UnitPixel);

будет достаточно

g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height), 0, 0, in_img.GetWidth, in_img.GetHeight, UnitPixel);

__
Вопросы? Задавай. =)


Автор: Elsper.ru


VN:F [1.9.14_1148]
Rating: 4.0/10 (8 votes cast)
Работа с JPG в Delphi (библиотека GDI+), 4.0 out of 10 based on 8 ratings

5 thoughts on “Работа с JPG в Delphi (библиотека GDI+)

  1. Странно, что из коробки только bmp поддержка. В 6ом билдере даже есть jpg. Я отдельно библиотеку скачивал только для гифок ибо прозрачность рулит 🙂

  2. Ну как есть так есть. Может в более поздних версиях или в каких-то переделанных дистрибутивах это поддерживается, но в довольно старой на самом деле семерке этого нет.

  3. uses JPEG…

    var
    i: TjpegImage;
    begin
    i:= TjpegImage.Create;
    i.assign(image1.picture.graphic);
    i.CompressionQuality=80;
    i.JpegNeeded;
    i.saveToFile(‘c:\temp\myimage.jpg’);
    i.free;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Спoнcopcкиe ссылки

Морг петербурга: единый номер моргов gos-ritual.ru.