Skip to main content

Reading RAW Images in .NET applications using C#

Sometimes the photos captured from cameras are saved in a raw format. The RAW files are not ready for editing with any bitmap editor. By default GDI+ in windows application do not support RAW file formats. So while reading a RAW image file in .NET we can get exceptions like "Out of memory". Here we will discuss method to read RAW image file in C# application.

Using DCRaw

dcraw is an open-source computer program which is able to read numerous raw image formats, typically produced by high-end digital cameras. dcraw converts these images into the standard PPM and TIFF image formats. Here is the sample in C# to extarct image from RAW file using DCRaw executable


string PathToDcRawExecutable = "C:\\DcRaw\\dcraw-ms.exe";
var _sourceImage = (Bitmap)Image.FromStream(GetImageFromRaw("c:\\testimage.ORF", PathToDcRawExecutable));

public Stream GetImageFromRaw(string inputFile, string dcRawExe)
{
    var startInfo = new ProcessStartInfo(dcRawExe)
    {
        Arguments = "-c -e \"" + inputFile + "\"",
        RedirectStandardOutput = true,
        UseShellExecute = false
    };

    var process = Process.Start(startInfo);

    var image = Image.FromStream(process.StandardOutput.BaseStream);

    var memoryStream = new MemoryStream();
    image.Save(memoryStream, ImageFormat.Png);

    return memoryStream;
}

Here are the links for DcRaw project

http://www.cybercom.net/~dcoffin/dcraw/
http://www.centrostudiprogressofotografico.it/en/dcraw/  (VS 2008 compiled code)

Comments

  1. Oh, yes! Maybe this will work for me. I am having trouble figuring out how to use the DCRAw files.

    ReplyDelete
    Replies
    1. Oh my god. It worked! Almost first time. I made a cheap ActionResult and View called Converter, downloaded the 32 bit version (VS was in (x86) folder) and used a RAW image I had taken with my Canon 40D. I just changed the extentsion to .CR2 and output to .Tiff and it worked!!
      Don't know what to do with the "var _sourceImage", but I also just saved the image to file location also and that worked. I would love to start a dialogue with you on this subject. You know, I searched and searched for days and this was first way I could get to work. So simple. You are geniuses. I do wonder what Arguments I can set. Is there a resolution or quality? Do you have any resources for these settings? Thank you very much and here is my code inside an MVC C# web application.

      public ActionResult Converter()
      {
      string PathToDcRawExecutable = "C:\\DCRaw\\dcraw-9.27-ms-32-bit.exe";

      var _sourceImage = (Bitmap)Image.FromStream(GetImageFromRaw("c:\\DCRaw\\Alf.CR2", PathToDcRawExecutable));
      return View();

      }


      public Stream GetImageFromRaw(string inputFile, string dcRawExe)
      {

      var startInfo = new ProcessStartInfo(dcRawExe)
      {
      Arguments = "-c -e \"" + inputFile + "\"",
      RedirectStandardOutput = true,
      UseShellExecute = false
      };

      var process = Process.Start(startInfo);

      var image = Image.FromStream(process.StandardOutput.BaseStream);

      var memoryStream = new MemoryStream();
      image.Save(memoryStream, ImageFormat.Tiff);
      image.Save("C:\\DCRaw\\Converted.tiff", ImageFormat.Tiff);
      return memoryStream;
      }

      Delete
    2. Please note that in your example you have 2 different words:
      GetImageDataFromRaw but the function is GetImageFromRaw.
      Once I figured that out and what was going on, it worked like a charm.
      So, I have that "var _sourceImage" filled up. Can I use that to make some resized .jpegs? (600x600 and thumbnail to be exact)

      Delete
    3. hey! good to know that it is helpful to you. Thanks! for letting me know about 2 different words.

      About var _sourceImage this memory stream can be converted into an jpeg Image and then it can be resized. To extract thumbnail : http://newapputil.blogspot.in/2015/04/create-thumbnail-of-image-using-c.html

      Delete
  2. This comment has been removed by the author.

    ReplyDelete

Post a Comment

Popular posts from this blog

Show Image on canvas HTML5

Here is the sample code to select image from system and display it on html5 canvas and javascript: <input type= "file" id= "selectedImage" /> <canvas id= "myCanvas" width= "500" height= "500" > </canvas> Javascript code: $( "#selectedImage" ).change( function (e) { var URL = window .URL; var url = URL.createObjectURL(e.target.files[ 0 ]); img.src = url; img.onload = function () { var canvas = document .getElementById( "myCanvas" ); var ctx = canvas.getContext( "2d" ); var imgSize = calculateAspectRatioFit(img.width, img.height, canvas.clientWidth, canvas.clientHeight); ctx.clearRect( 0 , 0 , canvas.width, canvas.height); ctx.drawImage(img, 0 , 0 , imgSize.width, imgSize.height); } }); function calculateAspectRatioFit(srcWidth, srcHeight, maxWidth, maxHeight) { var ratio = Math .min(maxWi

Pass byte array from C# to C++ and vice-versa

Pass byte array from C# to C++                           If you want to pass a byte array to native DLL as parameter, you can use the Intptr to do this, please check the demo below. /C++ API code: TestDLL_API void TestArrayPara (BYTE * pArray, int nSize) { for ( int i= 0 ; i<nSize; i++) printf( "%d\n" , pArray[i]); } //C# code: class TestClass { [DllImport(@"TestDll.dll")] public static extern void TestArrayPara (IntPtr pArray, int nSize); public static void Test () { byte [] array = new byte [ 16 ]; for ( int i = 0 ; i < 16 ; i++) { array[i] = ( byte )(i + 97 ); } int size = Marshal.SizeOf(array[ 0 ]) * array.Length; IntPtr pnt = Marshal.AllocHGlobal(size); try { // Copy the array to unmanaged memory. Marshal.Copy(array, 0 , pnt, array

Display Tooltip for Combo Box item C#.NET Winforms

In windows form combo box control sometimes while adidng items dynamically we have items whose width is greater than width of combox box control. In this case for making UI more user friendly we can show tooltip over such item. Here is the sample C# code to display such tooltip:  Add a Tooltip control on the form.  Add following code : this . combo_box1 . DropDownStyle = System . Windows . Forms . ComboBoxStyle . DropDownList; this . combo_box1 . DrawMode = DrawMode . OwnerDrawFixed; this . combo_box1 . DrawItem += new DrawItemEventHandler(combo_box1_DrawItem); this . combo_box1 . DropDownClosed += new EventHandler(combo_box1_DropDownClosed); this . combo_box1 . MouseLeave += new EventHandler(combo_box1_Leave); void combo_box1_DrawItem( object sender, DrawItemEventArgs e) { if (e . Index < 0 ) { return ; } string text = combo_box1 . GetItemText(combo_box1 . Items[e . Index