For a period there was an issue with printing images in reports. They all look kind of distorted / scrambled. After a while I figured out that the reason for this was the image size stored in the blob field. So what to do? Well, I made a new function, which could resize the image automatically.
The following function (procedure) ResizeImages can import a image file, resize the image and then save the file again.
All this is now possible in NAV 2018 thanks to the use of .NET.
PROCEDURE ResizeImage(FileName : Text;UpsizeIfSmaller : Boolean;MaintainAspectRatio : Boolean;NewWidth : Integer;NewHeight : Integer); VAR TempBlob : TEMPORARY Record 90000; ItemDesignSetup : Record 90000; Bitmap : System.Drawing.Bitmap; ImageFormat : System.Drawing.Imaging.ImageFormat; InStr : InStream; OutStr : OutStream; AspectRatio : Decimal; BEGIN ItemDesignSetup.GET; IF (NewWidth = 0) OR (NewHeight = 0) THEN BEGIN NewWidth := ItemDesignSetup."Resize Width"; NewHeight := ItemDesignSetup."Resize Height"; END; IF (NewWidth = 0) OR (NewHeight = 0) THEN EXIT; TempBlob.INIT; //Load image TempBlob."Temp Resized Picture".IMPORT(FileName); TempBlob."Temp Resized Picture".CREATEINSTREAM(InStr); Bitmap := Bitmap.Bitmap(InStr); //Calculate new size IF NOT UpsizeIfSmaller THEN IF (NewWidth >= Bitmap.Width) OR (NewHeight >= Bitmap.Height) THEN EXIT; IF Bitmap.Width / NewWidth < Bitmap.Height / NewHeight THEN AspectRatio := Bitmap.Width / NewWidth ELSE AspectRatio := Bitmap.Height / NewHeight; IF MaintainAspectRatio THEN BEGIN NewHeight := ROUND(Bitmap.Height / AspectRatio, 1, '<'); NewWidth := ROUND(Bitmap.Width / AspectRatio, 1, '<'); END; //Resize image CLEAR(TempBlob."Temp Resized Picture"); TempBlob."Temp Resized Picture".CREATEOUTSTREAM(OutStr); Bitmap := Bitmap.Bitmap(Bitmap,NewWidth,NewHeight); //Save resized image Bitmap.Save(OutStr,ImageFormat.Jpeg); Bitmap.Save(FileName, ImageFormat.Jpeg); END;
Be the first to comment