Решил я тут поковыряться в своих прогах, а они отказываются компилиться из за отсутсвия модулей 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
Странно, что из коробки только bmp поддержка. В 6ом билдере даже есть jpg. Я отдельно библиотеку скачивал только для гифок ибо прозрачность рулит 🙂
Ну как есть так есть. Может в более поздних версиях или в каких-то переделанных дистрибутивах это поддерживается, но в довольно старой на самом деле семерке этого нет.
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;
не хватает описания с поворотом изображения и сохранением в stream
g.free не помешает в конце)