Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Конвертация PNG GIF BMP в JPG в TMemoryStream


Автор: Pcrepair 3.3.2015, 00:17
Добрый день. Есть необходимость конвертации картинок разных форматов в ЖПЕГ, но желательно в TMemoryStream, чтоб все было в ОЗУ
для начала

Код

PicStream:TMemoryStream;
....
PicStream.LoadFromFile(FullPath1+PicNameStr);
TypeOfPic:=KindOfImage(PicStream.Memory);     (*функция возвращает число соответсвующее типу загруженного с Жд файла, все работает*)

if TypeOfPic = 4 then
begin
  ShowMessage('PNG');
  Png2Jpeg(PicStream);        (*вызов процедуры где и должна быть конвертация*)
end;

PicStream.Position := 0;  (*загрузка в ИМИДЖ картинки только ЖПЕГ из потока после трансформации, тут все работает, если ЖПЕГ то вывод в норме*)
JPG:= TJpegImage.Create;
try
  JPG.LoadFromStream(PicStream);
  ImgConv.Picture.Graphic:=JPG;
finally
  FreeAndNil(JPG);
end;

....
procedure Png2Jpeg(aPicStream:TMemoryStream);
var  JPG:TJpegImage;  PNG:TPngImage;  BMP:TBitmap;
begin
  JPG:=TJpegImage.Create;
  PNG:=TPngImage.Create;
  BMP:=TBitmap.Create;
  try
    aPicStream.Position:=0;
    PNG.LoadFromStream(aPicStream);
    //BMP.Assign(PNG);
    //JPG.Assign(BMP);
    JPG.Assign(PNG);

    JPG.SaveToStream(aPicStream);
  finally
    FreeAndNil(JPG);
    FreeAndNil(PNG);
    FreeAndNil(BMP);
  end;
end;


идет ошибка 53, что значит отсутствие ЖПЕГ при выводе в ИМИДЖ результатов конвертации

Вопрос : 
- вообще везде используют только загрузку выгрузку в файл, не поток, может из за этого
- что не учтено?
- может в ХЕ3 что то по другому чем с Д7, откуда все примеры

Автор: Illusion Dolphin 3.3.2015, 09:02
Цитата

идет ошибка 53, что значит 

Что JPEG отсутсвует или невалидный. Предположу, что aPicStream содержит 2 картинки - [PNG][JPEG] т.к. SaveToStream дописывает в стрим и не удаляет из него ничего. 

Автор: Pcrepair 3.3.2015, 16:31
точно, но кроме того нужно еще и БМП использовать, итаго :

Код

procedure Png2Jpeg(aPicStream:TMemoryStream; aSmoothing:Boolean; aCompressionQuality:Integer);
var  JPG:TJpegImage;  PNG:TPngImage;  BMP:TBitmap;
begin
  JPG:=TJpegImage.Create;
  PNG:=TPngImage.Create;
  BMP:=TBitmap.Create;
  try
    aPicStream.Position:=0;
    PNG.LoadFromStream(aPicStream);
    BMP.Assign(PNG);
    JPG.Assign(BMP);
    aPicStream.Clear;
    aPicStream.Position := 0;
    JPG.SaveToStream(aPicStream);
  finally
    FreeAndNil(JPG);
    FreeAndNil(PNG);
    FreeAndNil(BMP);
  end;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)