whats new ¦  programming tips ¦  indy articles ¦  intraweb articles ¦  informations ¦  links ¦  interviews
 misc ¦  tutorials ¦  Add&Win Game

Tips (1541)

Database (90)
Files (137)
Forms (107)
Graphic (114)
IDE (21)
Indy (5)
Internet / LAN (130)
IntraWeb (0)
Math (76)
Misc (126)
Multimedia (45)
Objects/
ActiveX (51)

OpenTools API (3)
Printing (35)
Strings (83)
System (266)
VCL (242)

Top15

Tips sort by
component


Search Tip

Add new Tip

Add&Win Game

Advertising

41 Visitors Online


 
...Resize an image (undistorsioned result image)?
Autor: Josep Ma. Feliu
[ Print tip ]  

Tip Rating (85):  
     


{
This function resizes a bitmap calculating the average color of a rectangular
area of pixels from source bitmap to a pixel or a rectangular area to target
bitmap.

It produces a soft-color and undistorsioned result image unlike the StretchDraw
method

I think that this method have a tenichal name, but I am not sure.

As you can see, this function could be very optimized :p
}

procedure TFormConvertir.ResizeBitmap(imgo, imgd: TBitmap; nw, nh: Integer);
var
  
xini, xfi, yini, yfi, saltx, salty: single;
  x, y, px, py, tpix: integer;
  PixelColor: TColor;
  r, g, b: longint;

  function MyRound(const X: Double): Integer;
  begin
    
Result := Trunc(x);
    if Frac(x) >= 0.5 then
      if 
x >= 0 then Result := Result + 1
      else
        
Result := Result - 1;
    // Result := Trunc(X + (-2 * Ord(X < 0) + 1) * 0.5);
  
end;

begin
  
// Set target size

  
imgd.Width  := nw;
  imgd.Height := nh;

  // Calcs width & height of every area of pixels of the source bitmap

  
saltx := imgo.Width / nw;
  salty := imgo.Height / nh;


  yfi := 0;
  for y := 0 to nh - 1 do
  begin
    
// Set the initial and final Y coordinate of a pixel area

    
yini := yfi;
    yfi  := yini + salty;
    if yfi >= imgo.Height then yfi := imgo.Height - 1;

    xfi := 0;
    for x := 0 to nw - 1 do
    begin
      
// Set the inital and final X coordinate of a pixel area

      
xini := xfi;
      xfi  := xini + saltx;
      if xfi >= imgo.Width then xfi := imgo.Width - 1;


      // This loop calcs del average result color of a pixel area
      // of the imaginary grid

      
r := 0;
      g := 0;
      b := 0;
      tpix := 0;

      for py := MyRound(yini) to MyRound(yfi) do
      begin
        for 
px := MyRound(xini) to MyRound(xfi) do
        begin
          
Inc(tpix);
          PixelColor := ColorToRGB(imgo.Canvas.Pixels[px, py]);
          r := r + GetRValue(PixelColor);
          g := g + GetGValue(PixelColor);
          b := b + GetBValue(PixelColor);
        end;
      end;

      // Draws the result pixel

      
imgd.Canvas.Pixels[x, y] :=
        rgb(MyRound(r / tpix),
        MyRound(g / tpix),
        MyRound(b / tpix)
        );
    end;
  end;
end;

 

Rate this tip:

poor
very good


Copyright © by SwissDelphiCenter.ch
All trademarks are the sole property of their respective owners