Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Как конвертировать картинки?

Страницы: 1 2 След.
Как конвертировать картинки?
Всем привет. Я снова за советами. Мне нужно написать конвертер графических файлов. Как конвертировать из jpg в bmp я знаю. А как с остальными форматами. Да из jpg в 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;  
Обратно из bmp в jpg можно так
Код
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; 
Пользуйтесь. Функция конвертирует иконки (файлы ico) в bmp
Код
Var 
Icon   : TIcon; 
Bitmap : TBitmap; 
begin 
  Icon   := TIcon.Create; 
  Bitmap := TBitmap.Create; 
  Icon.LoadFromFile('c:\picture.ico'); 
  Bitmap.Width := Icon.Width; 
  Bitmap.Height := Icon.Height; 
  Bitmap.Canvas.Draw(0, 0, Icon); 
  Bitmap.SaveToFile('c:\picture.bmp'); 
  Icon.Free; 
  Bitmap.Free; 
end;
А вот, кстати, обратный код. Преобразует ico в bmp
Код
procedure TForm1.Button1Click(Sender: TObject);  
var  
  IconSizeX : integer;  
  IconSizeY : integer;  
  AndMask : TBitmap;  
  XOrMask : TBitmap;  
  IconInfo : TIconInfo;  
  Icon : TIcon;  
begin  
{Получаем размер иконки}  
  IconSizeX := GetSystemMetrics(SM_CXICON);  
  IconSizeY := GetSystemMetrics(SM_CYICON);  

{Создаём маску "And"}  
  AndMask := TBitmap.Create;  
  AndMask.Monochrome := true;  
  AndMask.Width := IconSizeX;  
  AndMask.Height := IconSizeY;  

{Рисуем на маске "And"}  
  AndMask.Canvas.Brush.Color := clWhite;  
  AndMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));  
  AndMask.Canvas.Brush.Color := clBlack;  
  AndMask.Canvas.Ellipse(4, 4, IconSizeX - 4, IconSizeY - 4);  

{Рисуем для теста}  
  Form1.Canvas.Draw(IconSizeX * 2, IconSizeY, AndMask);  

{Создаём маску "XOr"}  
  XOrMask := TBitmap.Create;  
  XOrMask.Width := IconSizeX;  
  XOrMask.Height := IconSizeY;  

{Рисуем на маске "XOr"}  
  XOrMask.Canvas.Brush.Color := ClBlack;  
  XOrMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));  
  XOrMask.Canvas.Pen.Color := clRed;  
  XOrMask.Canvas.Brush.Color := clRed;  
  XOrMask.Canvas.Ellipse(4, 4, IconSizeX - 4, IconSizeY - 4);  

{Рисуем в качестве теста}  
  Form1.Canvas.Draw(IconSizeX * 4, IconSizeY, XOrMask);  

{Создаём иконку}  
  Icon := TIcon.Create;  
  IconInfo.fIcon := true;  
  IconInfo.xHotspot := 0;  
  IconInfo.yHotspot := 0;  
  IconInfo.hbmMask := AndMask.Handle;  
  IconInfo.hbmColor := XOrMask.Handle;  
  Icon.Handle := CreateIconIndirect(IconInfo);  

{Уничтожаем временные битмапы}  
  AndMask.Free;  
  XOrMask.Free;  

{Рисуем в качестве теста}  
  Form1.Canvas.Draw(IconSizeX * 6, IconSizeY, Icon);  

{Объявляем иконку в качестве иконки приложения}  
  Application.Icon := Icon;  

{генерируем перерисовку}  
  InvalidateRect(Application.Handle, nil, true);  

{Освобождаем иконку}  
  Icon.Free;  
end;  
Добавлю и я один интересный код. Он позволяет конвертировать bmp в wmf
Код
procedure ConvertBMP2WMF 
(const BMPFileName, WMFFileName: TFileName);  
var  
  MetaFile : TMetafile;  
  Bitmap : TBitmap;  
begin  
  Metafile := TMetaFile.Create;  
  Bitmap := TBitmap.Create;  
  try  
    Bitmap.LoadFromFile(BMPFileName);  
    with MetaFile do  
    begin  
      Height := Bitmap.Height;  
      Width  := Bitmap.Width;  
      Canvas.Draw(0, 0, Bitmap);  
      SaveToFile(WMFFileName);  
    end;  
  finally 
      Bitmap.Free;  
    MetaFile.Free;  
  end;  
end; 

Использовать функцию нужно так
Код
ConvertBMP2WMF('c:\mypic.bmp','c:\mypic.wmf')
Есть также функция преобразования bmp в emf
Код
 
function bmp2emf(const SourceFileName: TFileName): Boolean;  
var  
  Metafile: TMetafile;  
  MetaCanvas: TMetafileCanvas;  
  Bitmap: TBitmap;  
begin  
  Metafile := TMetaFile.Create;  
  try  
    Bitmap := TBitmap.Create;  
    try  
      Bitmap.LoadFromFile(SourceFileName);  
      Metafile.Height := Bitmap.Height;  
      Metafile.Width  := Bitmap.Width;  
      MetaCanvas := TMetafileCanvas.Create(Metafile, 0);  
      try  
        MetaCanvas.Draw(0, 0, Bitmap);  
      finally  
        MetaCanvas.Free;  
      end;  
    finally  
      Bitmap.Free;  
    end;  
    Metafile.SaveToFile(ChangeFileExt(SourceFileName, '.emf'));  
  finally  
    Metafile.Free;  
  end;  
end;  

procedure TForm1.Button1Click(Sender: TObject);  
begin  
  bmp2emf('C:\TestBitmap.bmp');  
end; 
Кстати, конвертировать из wmf в bmp не намного сложнее
Код
 procedure ConvertWMF2BMP 
(const WMFFileName, BMPFileName: TFileName);  
var  
  MetaFile : TMetafile;  
  Bitmap : TBitmap;  
begin  
  Metafile := TMetaFile.Create;  
  Bitmap := TBitmap.Create;  
  try  
    MetaFile.LoadFromFile(WMFFileName);  
    with Bitmap do  
    begin  
      Height := Metafile.Height;  
      Width  := Metafile.Width;  
      Canvas.Draw(0, 0, MetaFile);  
      SaveToFile(BMPFileName);  
    end;  
  finally 
      Bitmap.Free;  
    MetaFile.Free;  
  end;  
end;
Не знаю, может быть не совсем в тему, но все же привожу код, как можно конвертировать tiff в pdf
Код
 function TifToPDF(TIFFilename, PDFFilename: string): boolean;  
var  
  AcroApp : variant;  
  AVDoc : variant;  
  PDDoc : variant;  
  IsSuccess : Boolean;  
begin  
  result := false;  
  if not fileexists(TIFFilename) then exit;  

  try  
    AcroApp := CreateOleObject('AcroExch.App');  
    AVDoc := CreateOleObject('AcroExch.AVDoc');  

    AVDoc.Open(TIFFilename, '');  
    AVDoc := AcroApp.GetActiveDoc;  

    if AVDoc.IsValid then  
    begin  
      PDDoc := AVDoc.GetPDDoc;  

      PDDoc.SetInfo ('Title', '');  
      PDDoc.SetInfo ('Author', '');  
      PDDoc.SetInfo ('Subject', '');  
      PDDoc.SetInfo ('Keywords', '');  

      result := PDDoc.Save(1 or 4 or 32, PDFFilename);  

      PDDoc.Close;  
    end;  

    AVDoc.Close(True);  
    AcroApp.Exit;  

  finally  
    VarClear(PDDoc);  
    VarClear(AVDoc);  
    VarClear(AcroApp);  
  end;  
end;  
Тогда и я добавлю, думаю, этот код также будет полезен. Итак, добавляю функцию конвертирования bmp в rtf
Код
 function BitmapToRTF(pict: TBitmap): string;  
var  
  bi, bb, rtf: string;  
  bis, bbs: Cardinal;  
  achar: ShortString;  
  hexpict: string;  
  I: Integer;  
begin  
  GetDIBSizes(pict.Handle, bis, bbs);  
  SetLength(bi, bis);  
  SetLength(bb, bbs);  
  GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);  
  rtf := '{\rtf1 {\pict\dibitmap0 ';  
  SetLength(hexpict, (Length(bb) + Length(bi)) * 2);  
  I := 2;  
  for bis := 1 to Length(bi) do  
  begin  
    achar := IntToHex(Integer(bi[bis]), 2);  
    hexpict[I - 1] := achar[1];  
    hexpict[I] := achar[2];  
    Inc(I, 2);  
  end;  
  for bbs := 1 to Length(bb) do  
  begin  
    achar := IntToHex(Integer(bb[bbs]), 2);  
    hexpict[I - 1] := achar[1];  
    hexpict[I] := achar[2];  
    Inc(I, 2);  
  end;  
  rtf := rtf + hexpict + ' }}';  
  Result := rtf;  
end;  
А может, кто подскажет, как можно конвертировать bmp в gif? Пожалуйста
Вот есть такой код.
Код
 uses
...
GIFImg;

...
var
  BMP: TBitmap;
  GIF: TGIFImage;

...
    GIF := TGIFImage.Create;
    try
      // Конвертируем в GIF
      GIF.Assign(BMP);
      // Можно и сохранить GIF
      GIF.SaveToFile('123.gif');
      // Можнои отобразить GIF
      Form1.Image1.Picture.Assign(GIF);
    finally
      GIF.Free;
    end;
 
А у меня не получается, пишет, что нет такого модуля GIFImg.
Странно. У меня в Delphi2007 есть. Может быть, у Вас версия какая-то устаревшая.
Ни такая уж и устаревшая версия Delphi 2006, но модуля все равно нет.
Ребят не нужно мучиться. Есть простой код для конвертирования.
Код
 uses GDIPAPI, GDIPOBJ, GDIPUTIL;
var
 img: TGPImage;
 encoderClsid: TGUID;
 stat: TStatus;
 error_string: string;
begin
 img := TGPImage.Create('c:Ccat.bmp');
 // получаем идентификатор класса кодировщика gif 
 GetEncoderClsid('image/gif', encoderClsid);
 stat := img.Save('c:Cat.gif', encoderClsid, nil);
 if(stat = Ok) then : {ВСЕ В ПОРЯДКЕ} else { ОШИБКА СОХРАНЕНИЯ };
 error_string := GetStatus(stat);
end;
 
Это можно сделать очень просто. Достаточно использовать сторонние компоненты. Тот же RxLib прекрасно справляется с этой задачей
Код
 uses
  ..., rxgif, Graphics...;

procedure Gif2Bmp(InputGifPath,OutputBMPPath:String);
var
 Input:TGifImage;
 Output:TBitmap;
begin
 Input:=TGifImage.Create;
 Input.LoadFromFile(InputGifPath);
 Output:=TBitmap.Create;
 Output.Assign(Input);
 Output.SaveToFile(OutputBMPPath);
end;
Кстати, да. RxLib во многом облегчает жизнь. Например, конвертирование gif в jpg также не проблема
Код
 uses
  ..., rxgif, Jpeg, Graphics...;

procedure Gif2Jpeg(InputGifPath,OutputJpegPath:String);
var
 Input:TGifImage;
 Output:TJpegImage;
begin
 Input:=TGifImage.Create;
 Input.LoadFromFile(InputGifPath);
 Output:=TJpegImage.Create;
 Output.Assign(Input);
 Output.Smoothing:=True; //Замыливание
 Output.CompressionQuality:=100; //Макс. качество
 Output.SaveToFile(OutputJpegPath);
Большое всем спасибо, но, у меня снова вопрос. Как можно работать с png?
Изменено: Иван Прокофьев - 22.12.2009 01:32:16
Для работы с png есть специальные модули, например, pngimage.
Изменено: Алексей Смирнов - 22.12.2009 01:37:46
Про pngimage я знаю. Я даже смог с его помощью реализовать сохранение в bmp, но выглядит это не очень красиво и мне не нравиться. Делаю так, сначала загружаю png в timage, а потом уже сохраняю в bmp.
В таком случаи советую обратить внимание на другие сторонние компоненты. Например, есть GraphicsEx. Если честно сам я никогда с ним не работал, но судя по отзывам знакомых, вещь хорошая.
Согласен с Алексеем, GraphicsEx то, что нужно, но она не единственная есть также GDI+ вещь тоже хорошая.
Иван, те две библиотеке, что Вам перечислили выше, конечно, универсальны. В них есть поддержка не только png, но и других форматов. Если же требуется только работа с png то вполне достаточно pngdelphi скачать можно отсюда http://pngdelphi.sourceforge.net/
Всем привет, добавлю и я одну полезную библиотеку FreeImage. Подробнее о ней можно узнать на сайте http://freeimage.sourceforge.net/
Цитата
Иван Прокофьев пишет:
выглядит это не очень красиво и мне не нравиться

Если Вас смущает что нужно держать на форме timage то от этого можно легко избавиться. Вот вам код, который позволяет сохранить png в bmp без использования timage
Код
 
var
bmp: TBitMap;
begin
Image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Image.png');
bmp := TBitMap.Create;
bmp.Assign(Image1.Picture.Graphic);
bmp.SaveToFile('Image.bmp');
bmp.Free;
end;
Изменено: Sergeiv - 22.12.2009 16:26:49
Страницы: 1 2 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)