Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Просмотр изменений CompressionQuality у жпг


Автор: Тутанхамец 18.12.2006, 12:59
Туп я, наверно. Но не понимаю. (хотя причем тут "но"...) 

Вот хочу пользователю дать возможность менять качество/размер сохраняемого рисунка. Хочу чтобы он потянул "бегунок", и на рисунке отобразилось изменение качества и под рисунком в лэйбле - размер файла. Как во всех нормальных графических редакторах. 

Можно конечно при каждом движении бегунка сохранять рисунок во временный файл, а потом читать, рисовать и "взвешивать". Но это как-то некрасиво и, возможно, медленно. 

Есть способ лучше? 

Я пытаюсь так: 
Код

mj.CompressionQuality :=10;
mj.Compress;
image1.Picture.Assign (mj);

Но после компресса комп выдает ошибку на assign. 

Помогите, пожалуйста.

Автор: Snowy 18.12.2006, 13:10
image1.Picture := mj;

Автор: Тутанхамец 18.12.2006, 13:28
Тогда уж, чтоб не было ошибки типов:

Код

image1.Picture:= TPicture(mj);


но в этом случае лезет та же самая JPEG-error 42.

Пробовал так:
Код

mj.CompressionQuality :=10;
mj.Compress;
mj.DIBNeeded;
image1.Picture:= TPicture(mj);

и так:
Код

mj.CompressionQuality :=10;
mj.Compress;
mj.DIBNeeded;
image1.Picture.assign(mj);


Видимо, после compress с моей жпгой происходят какие-то неприятные изменения...

Автор: Snowy 18.12.2006, 13:35
Цитата(Тутанхамец @  18.12.2006,  13:28 Найти цитируемый пост)
image1.Picture:= TPicture(mj);
Вот так как раз не надо.
Я всё правильно написал.

Автор: Тутанхамец 18.12.2006, 13:37
Не компилирует:
Incompatible Types: TPicture and TJPEGImage. 

Это Делфи7, если что. Может в новых версиях иначе...

Автор: Snowy 18.12.2006, 13:45
Это потому что я соврал smile
Код

  Image1.Picture.Graphic := mj;

Автор: Тутанхамец 18.12.2006, 13:50
По-моему ты опять соврал... smile

Опять та же ошибка. Типа "проект породил исключение жпг еррор нумер 42". 

Вот мой немудренный код. Черновик, понятное дело. Проблема в button4Click:
Код


procedure TForm1.Button2Click(Sender: TObject);
begin
mj.LoadFromFile(edit1.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
mj:=TJPEGImage.Create;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//mj.DIBNeeded;
image1.Picture.Assign ( mj);
end;


//меняю качество и отображаю изменения
procedure TForm1.Button4Click(Sender: TObject);
begin
mj.CompressionQuality :=10;
mj.Compress;
Image1.Picture.Graphic := mj;
end;


Автор: Snowy 18.12.2006, 13:57
Код

uses jpeg;

procedure ShowImage;
var
  mj: TJPEGImage;
  ms: TMemoryStream;
begin
  mj := TJPEGImage.Create;
  ms := TMemoryStream.Create;
  try
    mj.Assign(bmp);
    mj.CompressionQuality := Form1.TrackBar1.Position * 10;
    mj.Compress;
    mj.SaveToStream(ms);
    ms.Position := 0;
    Form1.Caption := 'Size: ' + IntToStr(ms.Size div 1024) + 'кб';
    mj.LoadFromStream(ms);
    Form1.Image1.Picture.Graphic.Assign(mj);
  finally
    mj.Free; ms.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile('C:\1.bmp');
  Image1.Picture.Graphic := TBitmap.Create;
  ShowImage;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.Free;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  ShowImage;
end;

Автор: Тутанхамец 18.12.2006, 14:10
Ура! Заработало! Большое спасибо, Snowy! smile Сам бы я в жизни не догадался, что тут через потоки надо. 

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