yilmazca
yilmazca

Reputation: 19

Delphi JPEG resize and Compress

I have a some problems before saving image on TJPEGImage.

step 1: *(JPEG) I want add some text "on top of the picture" a new line.. not on image.. how can I do that?

step 2: * I want resize image to (cm) example : 200cm x 300cm / 320DPI etc..

step 3 *Save JPEG with compress What is the best lossless method ?

I was try DEVEXPRESS image component but it saved image 400MB... I couldnt find any compress method.

any Can help me ? thank you all

Upvotes: 0

Views: 4996

Answers (2)

dawood karimy
dawood karimy

Reputation: 179

you should save your jpeg image to bitmap first using

bmp.Assign(jpegimage);
bmp.Canvas.TextOut(5, 5, 'SomeText');

and then resize the bitmaps i use this function

procedure SmoothResize(Src, Dst: TBitmap);
var
  x, y: Integer;
  xP, yP: Integer;
  xP2, yP2: Integer;
  SrcLine1, SrcLine2: pRGBArray;
  t3: Integer;
  z, z2, iz2: Integer;
  DstLine: pRGBArray;
  DstGap: Integer;
  w1, w2, w3, w4: Integer;
begin
  Src.PixelFormat := pf24Bit;
  Dst.PixelFormat := pf24Bit;

  if (Src.Width = Dst.Width) and (Src.Height = Dst.Height) then
    Dst.Assign(Src)
  else
  begin
    DstLine := Dst.ScanLine[0];
    DstGap  := Integer(Dst.ScanLine[1]) - Integer(DstLine);

    xP2 := MulDiv(pred(Src.Width), $10000, Dst.Width);
    yP2 := MulDiv(pred(Src.Height), $10000, Dst.Height);
    yP  := 0;

    for y := 0 to pred(Dst.Height) do
    begin
      xP := 0;

      SrcLine1 := Src.ScanLine[yP shr 16];

      if (yP shr 16 < pred(Src.Height)) then
        SrcLine2 := Src.ScanLine[succ(yP shr 16)]
      else
        SrcLine2 := Src.ScanLine[yP shr 16];

      z2  := succ(yP and $FFFF);
      iz2 := succ((not yp) and $FFFF);
      for x := 0 to pred(Dst.Width) do
      begin
        t3 := xP shr 16;
        z  := xP and $FFFF;
        w2 := MulDiv(z, iz2, $10000);
        w1 := iz2 - w2;
        w4 := MulDiv(z, z2, $10000);
        w3 := z2 - w4;
        DstLine[x].rgbtRed := (SrcLine1[t3].rgbtRed * w1 +
          SrcLine1[t3 + 1].rgbtRed * w2 +
          SrcLine2[t3].rgbtRed * w3 + SrcLine2[t3 + 1].rgbtRed * w4) shr 16;
        DstLine[x].rgbtGreen :=
          (SrcLine1[t3].rgbtGreen * w1 + SrcLine1[t3 + 1].rgbtGreen * w2 +

          SrcLine2[t3].rgbtGreen * w3 + SrcLine2[t3 + 1].rgbtGreen * w4) shr 16;
        DstLine[x].rgbtBlue := (SrcLine1[t3].rgbtBlue * w1 +
          SrcLine1[t3 + 1].rgbtBlue * w2 +
          SrcLine2[t3].rgbtBlue * w3 +
          SrcLine2[t3 + 1].rgbtBlue * w4) shr 16;
        Inc(xP, xP2);
      end; {for}
      Inc(yP, yP2);
      DstLine := pRGBArray(Integer(DstLine) + DstGap);
    end; {for}
  end; {if}
end;  

and then save back them to jpeg image

JPG.assign(bitmap)
JPG.CompressionQuality := 99;
JPG.Compress;

Upvotes: 1

Deltics
Deltics

Reputation: 23052

JPEG is typically intrinsically compressed, although there is a lossless variant (which is also compressed, just in a different way that avoids loss).

I'm not familiar with the DevExpress facilities for handling JPEG's specifically, but any properties to do with JPEG handling will (should) almost certainly provide control over the degree of compression to be used which may or may not include an option for Lossless.

However, based on the resulting file size you are seeing, there is compression occurring in your case.

If you are resizing to 200cm x 300cm (78" x 118") at 320 dpi then your resulting image is (in round numbers) 25,000 x 38,000 px. That's a 950 MEGAPIXEL image!

The lossless (least compressed) JPEG representation of such an image would be over 1GB in size so if you are getting "only" 400MB then there clearly is some quite significant compression already at work.

Your problem is that you appear to want to compress the image more (to make the size smaller than 400MB) AND you want to use lossless compression, which would mean compressing it less (and make the file size larger).

So I think you need to decide what you really want (and you might then find you already have it).

Upvotes: 2

Related Questions