Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2015, 00:20   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию Конвертация PNG GIF BMP в JPG в TMemoryStream

Добрый день. Есть необходимость конвертации картинок разных форматов в ЖПЕГ, но желательно в 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, откуда все примеры
Pcrepair вне форума Ответить с цитированием
Старый 04.03.2015, 09:14   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от unit Vcl.Imaging.jpeg
...
Код:
procedure TJPEGImage.Assign(Source: TPersistent);
begin
  if Source is TJPEGImage then
  begin
    FImage.Release;
    FImage := TJPEGImage(Source).FImage;
    FImage.Reference;
    if TJPEGImage(Source).FBitmap <> nil then
    begin
      NewBitmap;
      FBitmap.Assign(TJPEGImage(Source).FBitmap);
    end;
  end
  else if Source is TBitmap then
  begin
    NewImage;
    NewBitmap;
    FBitmap.Assign(Source);
  end
  else
    inherited Assign(Source);
end;
...
Что означает, что в Assign жепега можно посылать или жепег или битмап. Думаю я.
Вообще при конвертациях и прочем удобно пользоваться TPicture.
... А, хотя нет, через TPicture чёт с ходу не вышло. Недосуг разбираться. Вот, через битмэп получается:
Код:
procedure Png2Jpeg (aPicStream:TMemoryStream);
var
  JPG: TJpegImage;
  BMP:TBitmap;
  PNG:TPngImage;
  pic: TPicture;
begin
  JPG:=TJpegImage.Create;
  PNG:=TPngImage.Create;
  BMP:=TBitmap.Create;
  pic := TPicture.Create;
  try
    aPicStream.Position:=0;
    PNG.LoadFromStream(aPicStream);
    BMP.Assign(PNG);
    JPG.Assign (BMP);

    aPicStream.Clear;
    aPicStream.Position:=0;
    JPG.SaveToStream(aPicStream);
  finally
    FreeAndNil(pic);
    FreeAndNil(BMP);
    FreeAndNil(JPG);
    FreeAndNil(PNG);
  end;
end;

procedure Bmp2Jpeg (aPicStream:TMemoryStream);
var
  JPG: TJpegImage;
  BMP:TBitmap;
  pic: TPicture;
begin
  JPG:=TJpegImage.Create;
  BMP:=TBitmap.Create;
  pic := TPicture.Create;
  try
    aPicStream.Position:=0;
    BMP.LoadFromStream(aPicStream);
    JPG.Assign (BMP);

    aPicStream.Clear;
    aPicStream.Position:=0;
    JPG.SaveToStream(aPicStream);
  finally
    FreeAndNil(pic);
    FreeAndNil(JPG);
    FreeAndNil(BMP);
  end;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
  JPG: TJpegImage;
begin
  if OpenPictureDialog1.Execute then begin
    MS := TMemoryStream.Create;

    MS.LoadFromFile (OpenPictureDialog1.FileName);
    ShowMessage(IntToStr(MS.Size));
    Png2Jpeg (MS);
    ShowMessage(IntToStr(MS.Size));
    JPG := TJPEGImage.Create;
    MS.Position := 0;
    JPG.LoadFromStream (MS);
    JPG.SaveToFile (OpenPictureDialog1.FileName + '.jpg');

    FreeAndNil(MS);
    FreeAndNil(JPG);
  end;
end;

Последний раз редактировалось Sibedir; 04.03.2015 в 09:33.
Sibedir вне форума Ответить с цитированием
Старый 04.03.2015, 18:23   #3
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию

пока вот так

Код:
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);
    //PNG
    BMP.Assign(PNG);
    //BMP
    JPG.Assign(BMP);
    aPicStream.Clear;
    aPicStream.Position := 0;
    JPG.SaveToStream(aPicStream);
  finally
    FreeAndNil(JPG);
    FreeAndNil(PNG);
    FreeAndNil(BMP);
  end;
end;
но осталась маленькая проблема : если исходный файл ПНГ имеет прозрачные области то после конвертации оное становятся черными.
тут что то можно поделать?
Pcrepair вне форума Ответить с цитированием
Старый 04.03.2015, 22:13   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Pcrepair Посмотреть сообщение
тут что то можно поделать?
Если честно, Pcrepair, то почитать справки по свойствам и процедурам. Да еще поискать в нэте. Ну и, на худой конец, поэксперементировать. Я обычно начинаю с последнего. Обычно помогает.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу алгоритм для открытия изображения BMP, PNG, JPG Rubelka Помощь студентам 5 10.12.2014 15:41
конвертация gif в bmp belyjj Общие вопросы Delphi 7 07.11.2012 23:45
Конвертер из png в jpg или gif или bmp Квэнди Мультимедиа в Delphi 8 04.10.2011 22:26
Ищу компонент конвертер(Bmp, Png, Tif, Gif...) в Jpeg ArtGrek Компоненты Delphi 16 25.05.2011 10:05
Загрузка GIF изображения в TImage из TMemoryStream Crystallon Общие вопросы Delphi 0 28.12.2010 12:16