Avatar billede razersedge Nybegynder
22. april 2003 - 16:55 Der er 11 kommentarer og
1 løsning

Resize JPEG

Hej Eksperter.

Jeg skal bruge et stykke kode som under runtime loader et jpeg/jpg billede, resizer den, og til sidst gemmer det resizede billede et andet sted på harddisken.

Uden nogen betydelig bekostning af kvalitet.

Jeg har søgt lidt rundt her på Eksperten og andre steder, kan dog ikke lige finde noget som virker med jpeg billeder.

Mange tak.
Avatar billede angelod Novice
22. april 2003 - 17:29 #1
Skal det resizes til at blive mindre eller større? Jeg har selv skrevet noget til generering af thumbnails fra diverse billedformater.
Avatar billede razersedge Nybegynder
22. april 2003 - 17:35 #2
Det skal være mindre - er forresten selv igang med at kigge på det, men smid gerne dit forslag, mit kører ikke helt endnu :)
Avatar billede razersedge Nybegynder
22. april 2003 - 17:36 #3
Hm.. har fået skåret et stykke af billedet i den rette størrelse, det er dog ikke resized, og det fylder noget mere end jeg synes er acceptabelt..
Avatar billede razersedge Nybegynder
22. april 2003 - 17:44 #4
Er indtil videre nået frem til det her:

procedure TForm1.Button1Click(Sender: TObject);
var
tmpBitmap,Bitmap : TBitmap;
Rect : TRect;
JPEGImage : TJPEGImage;
begin
Bitmap := TBItmap.Create;
tmpBitmap := TBitmap.Create;
JPEGImage := TJpegImage.Create;

JpegImage.LoadFromFile('f:\pics\jensen.jpg');
Bitmap.Assign(JpegImage);

Bitmap.Width  := 800;
Bitmap.Height := 600;
Rect.Top    := 0;
Rect.Left  := 0;
Rect.Right  := 800;
Rect.Bottom := 600;

Bitmap.Canvas.StretchDraw(Rect,tmpBitmap);

JPEGImage.Assign(Bitmap);

JpegImage.CompressionQuality := 40;
JpegImage.Compress;

JpegImage.SaveToFile('c:\jensen.jpg');

//Bitmap.SaveToFile('c:\jensen.bmp');
end;


Det loader billeder, men tager kun et lille udklip af billedet (fra øverste venstre hjørne, i størrelsen 800*600), det resizer ikke.. kigger videre på det..
Avatar billede razersedge Nybegynder
22. april 2003 - 17:47 #5
dohh... Bitmap.Assign(JpegImage); skulle være tmpBitmap.Assign(JpegImage);... tsk tsk..

Jeg har fået løst mit problem, lukker spørgsmålet.
Avatar billede razersedge Nybegynder
22. april 2003 - 17:47 #6
Eller kender du en anden måde at gøre det på? Virker lidt som en sjov måde at gøre det på..?
Avatar billede angelod Novice
22. april 2003 - 17:48 #7
Næh, det er også noget i den retning jeg plejer at bruge. :o)
Avatar billede razersedge Nybegynder
22. april 2003 - 17:49 #8
hehe, så takker jeg for tiden ;)
Avatar billede borrisholt Novice
23. april 2003 - 08:11 #9
problemet er du ikke scalerer dit billede ... Hvis nu der orginale billexe ikke var 1 x 1.25 så har du et problem.

Jens B
Avatar billede angelod Novice
23. april 2003 - 10:11 #10
Jeg formodede at alle billederne var i et 4:3 perspektiv. Men du har ret, skalering bør tage højde for forskellige størrelser.
Avatar billede borrisholt Novice
23. april 2003 - 10:14 #11
prøv den her :

unit JpegConv;

interface

uses Windows, Graphics, SysUtils, Classes;

procedure CreateThumbnail(const InFileName, OutFileName: string; Width, Height: Integer; Compress: Boolean = true; ProgressEvent : TProgressEvent = nil); overload;

implementation

uses Jpeg;

procedure CreateThumbnail(InStream, OutStream: TStream; Width, Height: Integer; Compress: Boolean; ProgressEvent : TProgressEvent); overload;
var
  JpegImage: TJpegImage;
  Bitmap: TBitmap;
  Ratio: Double;
  ARect: TRect;
  AHeight (*, AHeightOffset*): Integer;
  AWidth (*, AWidthOffset*): Integer;
begin
//  Check for invalid parameters
  JpegImage := TJpegImage.Create;
  try
//  Load the image
    JpegImage.LoadFromStream(InStream);
    if Width = 0 then
      Width := JpegImage.Width;
    if Height = 0 then
      Height := JpegImage.Height;

    // Create bitmap, and calculate parameters
    Bitmap := TBitmap.Create;
    try
      Ratio := JpegImage.Width / JpegImage.Height;
      if Ratio > 1 then
      begin
        AHeight := Round(Width / Ratio);
//        AHeightOffset:=(Height-AHeight) div 2;
        AWidth := Width;
//        AWidthOffset:=0;
      end
      else
      begin
        AWidth := Round(Height * Ratio);
//        AWidthOffset:=(Width-AWidth) div 2;
        AHeight := Height;
//        AHeightOffset:=0;
      end;

      Bitmap.Width := AWidth;
      Bitmap.Height := AHeight;
//      Bitmap.Canvas.Brush.Color:=FillColor;
//      Bitmap.Canvas.FillRect(Rect(0,0,Width,Height));
// StretchDraw original image
//      ARect:=Rect(AWidthOffset,AHeightOffset,AWidth+AWidthOffset,AHeight+AHeightOffset);
      ARect := Rect(0, 0, AWidth, AHeight);
      Bitmap.Canvas.StretchDraw(ARect, JpegImage);
// Assign back to the Jpeg, and save to the file
      JpegImage.Free;

      JpegImage := TJpegImage.Create;
      JpegImage.OnProgress := ProgressEvent;
      JpegImage.Assign(Bitmap);

      if Compress then
        JpegImage.CompressionQuality := 30;
     
      JpegImage.SaveToStream(OutStream);
    finally
      Bitmap.Free;
    end;
  finally
    JpegImage.Free;
  end;
end;

procedure CreateThumbnail(const InFileName, OutFileName: string; Width, Height: Integer; Compress: Boolean; ProgressEvent : TProgressEvent); overload;
var
  InStream, OutStream: TFileStream;
begin
  InStream := TFileStream.Create(InFileName, fmOpenRead);
  try
    OutStream := TFileStream.Create(OutFileName, fmOpenWrite or fmCreate);
    try
      CreateThumbnail(InStream, OutStream, Width, Height, Compress, ProgressEvent);
    finally
      OutStream.Free;
    end;
  finally
    InStream.Free;
  end;
end;

end.


Jens B
Avatar billede razersedge Nybegynder
23. april 2003 - 20:22 #12
Tak for opmærksomheden borrisholt, men var allerede selv kommet til at tænke på det, så jeg havde allerede lavet skalerings mulighed.

Har ikke prøvet dit kode, da mit eget ellers virker udemærket, tog mig da også til hovedet da jeg så det første billede som ikke var i forholdet 4:3 ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester