LEADTOOLS Image File Support (Leadtools.Codecs assembly) Send comments on this topic. | Back to Introduction - All Topics | Help Version 17.0.3.29
SaveImage Event
See Also 
Leadtools.Codecs Namespace > RasterCodecs Class : SaveImage Event



Occurs during the file save process to provide functionality for manually handling the output image data or monitoring a progress status.

Syntax

Visual Basic (Declaration) 
Public Event SaveImage As EventHandler(Of CodecsSaveImageEventArgs)
Visual Basic (Usage)Copy Code
Dim instance As RasterCodecs
Dim handler As EventHandler(Of CodecsSaveImageEventArgs)
 
AddHandler instance.SaveImage, handler
C# 
public event EventHandler<CodecsSaveImageEventArgs> SaveImage
C++/CLI 
public:
event EventHandler<CodecsSaveImageEventArgs^>^ SaveImage

Event Data

The event handler receives an argument of type CodecsSaveImageEventArgs containing data related to this event. The following CodecsSaveImageEventArgs properties provide information specific to this event.

PropertyDescription
Buffer Gets the memory buffer containing one or more lines of output image data that the you must provide.
Cancel Gets or sets a value which allows the user to abort the save process.
FileName Gets the name of the file currently being saved.
FirstPage Gets the index of the first page being saved.
Image Gets the Leadtools.RasterImage object being saved.
ImagePage Gets the index of the RasterImage.Page currently being saved.
LastPage Gets the index of the last page being saved.
Lines Gets the number of lines to copy from Buffer.
Offset Gets the offset to the start of the image data.
OffsetValid Gets a value that determines whether the Offset property is valid.
Page Gets the page number currently being saved.
PagePercent Gets the save completion percentage of the current page.
Row Gets the current image row number of the first line in Buffer.
Stream Gets the stream object currently being saved.
TotalPercent Gets the overall completion percentage for the save soperation.

Example

This example will double the density of an image as it is being saved.

Visual BasicCopy Code
Public Sub SaveImageExample()
      Dim codecs As New RasterCodecs()

      Dim srcFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "Image1.cmp")
      Dim destFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "Image1_SaveImage.cmp")

      ' Load the source file (make sure to load as 24 bits/pixel)
      Dim image As RasterImage = codecs.Load(srcFileName, 24, CodecsLoadByteOrder.Bgr, 1, 1)

      ' Instruct RasterCodecs to generate the saved scanlines data for us to manipulate
      codecs.Options.Save.RetrieveDataFromImage = True

      ' Add a handler to the SaveImage event
      AddHandler codecs.SaveImage, AddressOf codecs_SaveImage

      ' Save the image
      codecs.Save(image, destFileName, RasterImageFormat.Cmp, 24)

      RemoveHandler codecs.SaveImage, AddressOf codecs_SaveImage

      image.Dispose()

      ' Clean up
      codecs.Dispose()
   End Sub

   Private Sub codecs_SaveImage(ByVal sender As Object, ByVal e As CodecsSaveImageEventArgs)
      ' This example works with images saved as 24-bit per pixel only
      Debug.Assert(e.Image.BitsPerPixel = 24)

      If e.Row = 0 Then
         ' Show information about the image being saved
         Console.WriteLine("Saving an image with {0} bpp to {1}", e.Image.BitsPerPixel, e.FileName)
         Console.WriteLine("Offset: {0}, OffsetValid: {1}", e.Offset, e.OffsetValid)
         Console.WriteLine("Page: {0} of {1}", e.Page, e.LastPage - e.FirstPage + 1)
         Console.WriteLine("Page percent: {0}, Total percent", e.PagePercent, e.TotalPercent)
      End If

      Console.WriteLine("Row: {0}, Lines {1}", e.Row, e.Lines)

      ' Get the scanlines from the image
      Dim scanlineLength As Integer = e.Image.BytesPerLine
      Dim scanline(scanlineLength - 1) As Byte

      ' Loop through all the scanlines in the data
      For y As Integer = 0 To e.Lines - 1
         ' Get this row
         e.Buffer.GetData(y * scanlineLength, scanline, 0, scanlineLength)

         ' We got the data, now double the intensity
         ' Remember, this is 24-bits/pixel
         For x As Integer = 0 To scanlineLength - 1
            scanline(x) = CType(scanline(x) * 2, Byte)
         Next

         ' Copy it back to the event buffer
         e.Buffer.SetData(y * scanlineLength, scanline, 0, scanlineLength)
      Next
   End Sub

Public NotInheritable Class LEAD_VARS
   Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
C#Copy Code
public void SaveImageExample()
   {
      RasterCodecs codecs = new RasterCodecs();

      string srcFileName = Path.Combine(LEAD_VARS.ImagesDir, "Image1.cmp");
      string destFileName = Path.Combine(LEAD_VARS.ImagesDir, "Image1_SaveImage.cmp");

      // Load the source file (make sure to load as 24 bits/pixel)
      RasterImage image = codecs.Load(srcFileName, 24, CodecsLoadByteOrder.Bgr, 1, 1);

      // Instruct RasterCodecs to generate the saved scanlines data for us to manipulate
      codecs.Options.Save.RetrieveDataFromImage = true;

      // Add a handler to the SaveImage event
      codecs.SaveImage += new EventHandler<CodecsSaveImageEventArgs>(codecs_SaveImage);

      // Save the image
      codecs.Save(image, destFileName, RasterImageFormat.Cmp, 24);

      codecs.SaveImage -= new EventHandler<CodecsSaveImageEventArgs>(codecs_SaveImage);

      image.Dispose();

      // Clean up
      codecs.Dispose();
   }

   private void codecs_SaveImage(object sender, CodecsSaveImageEventArgs e)
   {
      // This example works with images saved as 24-bit per pixel only
      Debug.Assert(e.Image.BitsPerPixel == 24);

      if(e.Row == 0)
      {
         // Show information about the image being saved
         Console.WriteLine("Saving an image with {0} bpp to {1}", e.Image.BitsPerPixel, e.FileName);
         Console.WriteLine("Offset: {0}, OffsetValid: {1}", e.Offset, e.OffsetValid);
         Console.WriteLine("Page: {0} of {1}", e.Page, e.LastPage - e.FirstPage + 1);
         Console.WriteLine("Page percent: {0}, Total percent", e.PagePercent, e.TotalPercent);
      }

      Console.WriteLine("Row: {0}, Lines {1}", e.Row, e.Lines);

      // Get the scanlines from the image
      int scanlineLength = e.Image.BytesPerLine;
      byte[] scanline = new byte[scanlineLength];

      // Loop through all the scanlines in the data
      for(int y = 0; y < e.Lines; y++)
      {
         // Get this row
         e.Buffer.GetData(y * scanlineLength, scanline, 0, scanlineLength);

         // We got the data, now double the intensity
         // Remember, this is 24-bits/pixel
         for(int x = 0; x < scanlineLength; x++)
         {
            scanline[x] *= 2;
         }

         // Copy it back to the event buffer
         e.Buffer.SetData(y * scanlineLength, scanline, 0, scanlineLength);
      }
   }

static class LEAD_VARS
{
   public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}
SilverlightCSharpCopy Code
public void SaveImageExample(Stream inStreamCmp, Stream outStreamCmp)
{
   RasterCodecs codecs = new RasterCodecs();
   // Load the source file (make sure to load as 24 bits/pixel)
   RasterImage image = codecs.Load(inStreamCmp, 24, CodecsLoadByteOrder.Bgr, 1, 1);

   // Add a handler to the SaveImage event
   codecs.SaveImage += new EventHandler<CodecsSaveImageEventArgs>(codecs_SaveImage);

   // Save the image
   codecs.Save(image, outStreamCmp, RasterImageFormat.Cmp, 24);

   codecs.SaveImage -= new EventHandler<CodecsSaveImageEventArgs>(codecs_SaveImage);

   image.Dispose();
}

byte[] _saveImageScanLine;

void codecs_SaveImage(object sender, CodecsSaveImageEventArgs e)
{
   if (e.Row == 0)
   {
      // Show information about the image being saved
      Console.WriteLine("Saving an image with {0} bpp to {1}", e.Image.BitsPerPixel, e.FileName);
      //Console.WriteLine("Offset: {0}, OffsetValid: {1}", e.Offset, e.OffsetValid);
      Console.WriteLine("Page: {0} of {1}", e.Page, e.PageCount);
   }

   Console.WriteLine("Row: {0}, Lines {1}", e.Row, e.Lines);

   // Get the scanlines from the image
   int lastRow = e.Row + e.Lines;
   int bytesPerLine = e.Image.BytesPerLine;
   RasterNativeBuffer buffer = e.Buffer;

   // See if we need to re-allocate the managed buffer
   if (_saveImageScanLine == null || _saveImageScanLine.Length < bytesPerLine)
      _saveImageScanLine = new byte[bytesPerLine];

   long offset = 0;
   for (int y = e.Row; y < lastRow; y++)
   {
      // Get the row into the managed buffer
      e.Image.Access();
      e.Image.GetRow(y, _saveImageScanLine, 0, bytesPerLine);
      e.Image.Release();

      // We got the data, now double the intensity
      // Remember, this is 24-bits/pixel
      for (int x = 0; x < bytesPerLine; x++)
         _saveImageScanLine[x] *= 2;

      // Copy the data into the buffer
      buffer.SetData(offset, _saveImageScanLine, 0, bytesPerLine);

      // Move the pointer to the position in the buffer for the next row
      offset += bytesPerLine;
   }
}
SilverlightVBCopy Code
Public Sub SaveImageExample(ByVal inStreamCmp As Stream, ByVal outStreamCmp As Stream)
   Dim codecs As RasterCodecs = New RasterCodecs()
   ' Load the source file (make sure to load as 24 bits/pixel)
   Dim image As RasterImage = codecs.Load(inStreamCmp, 24, CodecsLoadByteOrder.Bgr, 1, 1)

   ' Add a handler to the SaveImage event
   AddHandler codecs.SaveImage, AddressOf codecs_SaveImage

   ' Save the image
   codecs.Save(image, outStreamCmp, RasterImageFormat.Cmp, 24)

   RemoveHandler codecs.SaveImage, AddressOf codecs_SaveImage

   image.Dispose()
End Sub

Private _saveImageScanLine As Byte()

Private Sub codecs_SaveImage(ByVal sender As Object, ByVal e As CodecsSaveImageEventArgs)
   If e.Row = 0 Then
      ' Show information about the image being saved
      Console.WriteLine("Saving an image with {0} bpp to {1}", e.Image.BitsPerPixel, e.FileName)
      'Console.WriteLine("Offset: {0}, OffsetValid: {1}", e.Offset, e.OffsetValid);
      Console.WriteLine("Page: {0} of {1}", e.Page, e.PageCount)
   End If

   Console.WriteLine("Row: {0}, Lines {1}", e.Row, e.Lines)

   ' Get the scanlines from the image
   Dim lastRow As Integer = e.Row + e.Lines
   Dim bytesPerLine As Integer = e.Image.BytesPerLine
   Dim buffer As RasterNativeBuffer = e.Buffer

   ' See if we need to re-allocate the managed buffer
   If _saveImageScanLine Is Nothing OrElse _saveImageScanLine.Length < bytesPerLine Then
      _saveImageScanLine = New Byte(bytesPerLine - 1){}
   End If

   Dim offset As Long = 0
   Dim y As Integer = e.Row
   Do While y < lastRow
      ' Get the row into the managed buffer
      e.Image.Access()
      e.Image.GetRow(y, _saveImageScanLine, 0, bytesPerLine)
      e.Image.Release()

      ' We got the data, now double the intensity
      ' Remember, this is 24-bits/pixel
      Dim x As Integer = 0
      Do While x < bytesPerLine
         _saveImageScanLine(x) *= 2
         x += 1
      Loop

      ' Copy the data into the buffer
      buffer.SetData(offset, _saveImageScanLine, 0, bytesPerLine)

      ' Move the pointer to the position in the buffer for the next row
      offset += bytesPerLine
      y += 1
   Loop
End Sub

Remarks

This event will fire during saving images with the Save(RasterImage,String,RasterImageFormat,Int32) methods. If you use this event, you must copy the image data to the provided event buffer.

You can also use this event to get information about the image being saved, provide a progress status, and/or abort the save operation. For information on how to use this event as a progress status monitor, refer to CodecsSaveOptions.RetrieveDataFromImage and CodecsSaveImageEventArgs.

Requirements

Target Platforms: Silverlight, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7, MAC OS/X (Intel Only)

See Also