0

Подскажите как можно работать с изображениями в delphi без использования дополнительных библиотек (например таких как jpeg). Работать только с bmp файлами не подходит, т.к. bmp весит очень много.

Мне бы подошел любой формат изображений (кроме тех что много весят- прм. bmp). Библиотеку какую-нибудь тоже можно использовать, но чтобы она весила очень мало.

7
  • 2
    >Подскажите как можно работать с изображениями в delphi без использования дополнительных библеотек =========================================== >Библеотеку какую-нибудь тоже можно использовать вам не кажется, что вы сами себе противоречите?
    – DreamChild
    17 авг 2013 в 14:36
  • Я хотел сказать, что лучше всего без использования библеотек, но если это не возможно, то посоветуйте какую-нибудь маленькую библеотеку. 17 авг 2013 в 14:42
  • 1
    с какими конкретно изображениями? Работать с Jpeg, насколько помню, можно стандартными средствами Delphi. Почему вас не устраивают "большие" библиотеки и насколько большие для вас приемлемы?
    – DreamChild
    17 авг 2013 в 14:45
  • 1
    извините за нескромный вопрос - а зачем вам эти извращения?
    – DreamChild
    17 авг 2013 в 14:51
  • 1
    Забавно конечно, что ему зачем-то понадобился такой размер программы. Но в таком случае вам, наверное, стоило писать не на Delphi. К тому же, если ваша программа будет работать с изображениями, то расходы на оперативную память будут возрастать пропорционально размерам изображений, с которыми она работает, а это говорит о том, что все эти ухищрения коту под хвост
    – DreamChild
    17 авг 2013 в 14:59

2 ответа 2

1

Извините, здесь какая то "игра слов". ТС говорит о выводе имейджа( мне просто нужно вывести изображение на форму и все.), а в ответ получаем как конвертировать имейдж из бмп в жпег со всеми GDI +...

PS. LoadFromFile умеет и обычный TBitmap. А дальше можно просто Canvas.Draw-ом рисовать.

UPD Пример:

var img:Tbitmap;
...........
img:=Tbitmap.create;
img.loadfromfile(yourpathtoimage);
form1.canvas.draw(x,y,img);//здесь форма - для примера. Можно и TImage рисовать, дело вкуса.
img.free;
0

Из библиотек посоветовал бы использовать GDI+ (сам ее раньше использовал), наиболее адекватная и востребованная в Delphi графическая библиотека. Скачать можно тут. Некоторые ругают GDI+ за некоторую медлительность при прорисовке больших объемов графики, но судя по вашей задаче, она вам подойдет, так как вам придется работать с небольшими по объему изображениями. В список модулей (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.

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

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);

Надеюсь это вам поможет для работы с изображениями. Специфики вашей программы я к сожалению не знаю, из вопроса непонятно, что именно должна делать программа.

Про то как загружать jpg файлы и настраивать их, я думаю вам это известно (это уже стандартный GDI). Если нет, напомню коротким примером:

var jpg:TJpegImage;

if opendialog1.execute then
 image1.Picture.LoadFromFile(opendialog1.filename);
{создаем экземпляр объекта}
 jpg:=TJpegImage.Create;
 {присваиваем ему изображение}
 jpg.Assign(image1.picture.graphic);
 {устанавливаем степень сжатия (качество) 1..100}
 jpg.CompressionQuality:=TrackBar1.Position;
 {если установлен флаг "Оттенки серого", то пусть картинка будет серой:)}
 jpg.Grayscale:=checkbox1.Checked;
 {Упаковываем графику}
 jpg.Compress;
 {и сохраняем ее куда вам захочется}
 jpg.SaveToFile('D:\first.jpg');
 {уничтожаем экземпляр объекта}
 jpg.free;

Удачи, в работе!

7
  • Спасибо большое, сейчас посмотрю. Моя задача феноменально проста - мне просто нужно вывести изображение на форму и все. 17 авг 2013 в 19:05
  • а изображение где хранится? В виде ресурса в самой программе или загружается извне?
    – IntegralAL
    17 авг 2013 в 19:40
  • будет в виде ресурса храниться 17 авг 2013 в 20:32
  • Я так понял, чтобы программа работала на всех ПК нужно чтобы на ПК была установлена GDI. Как можно проверить установлена ли на ПК GDI? 17 авг 2013 в 21:11
  • Во-первый, GDI и GDI+ это две разные технологии, хотя одна другую продолжает... Во-вторых, если вы используйте GDI+ модули в программе (их нужно закинуть в папку lib в делфи 7) то откомпилированный продукт уже не будет ничего требовать от ПК (даже если на нем не стоит GDI+), так как компиляция будет влючать модули GDI+. Вообще для вашей задачи, такой как вывод изображения на форму, не нужен даже GDI+. Вполне можно обойтись и простым стандартным GDI. В канве выводим изображение и все...
    – IntegralAL
    18 авг 2013 в 11:24

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.