Click here to Skip to main content
15,905,915 members
Articles / Multimedia / GDI+
Article

Displaying 16-bit Images Using C#

Rate me:
Please Sign up or sign in to vote.
4.71/5 (12 votes)
8 Dec 2008CPOL3 min read 186.6K   8K   36   80
An article on how to use GDI+ methods for displaying 16-bit raw images.

Image 1

Introduction and Background

Displaying images on the screen is quite easy with C#. You just need to read the image using the method Image.FromFile, and you have the image available for you. After this, you need to use the Graphics method DrawImage to display it. This works fine for different image formats like BMP, JPEG, PNG, TIFF, etc., and especially for color images, which form a large percentage of images commonly encountered. In color images, each pixel has values associated with the three channels - red, green, and blue.

However, for many scientific and specialized applications, these 'general purpose' color images are not suitable. For example, in X-ray applications, the images are grayscale. In grayscale images, the value of each pixel is a single value representing the intensity at a pixel location. It is sufficient to store only that single grayscale value. Grayscale images may have bit depths of 8, or 16, or higher. In an 8-bit image, the intensity value varies over 0 - 255, with each pixel value being stored in a byte; whereas in a 16-bit image, the intensity value varies over 0 - 65535, with each pixel value being stored in two contiguous bytes. Certain applications require the precision offered by a 16-bit image representation.

Raw Images

The simplest format for a grayscale image is the raw format, where the raw pixel data of the image from top left to bottom right is stored in the file. Since a raw file does not have any header, it is necessary to know a priori the width, height, and bit depth. Here, we present a simple application to display the image stored in raw format, with the following assumptions: the bit depth is 16 bits per pixel, and the width and height of the image are identical.

Displaying the Image

The steps in displaying the image are:

  1. Open the file and read in the pixel data. Use a BinaryReader object since this is a binary file. Store the pixel data in an ArrayList of ushort data type. From the file size, compute the width and height of the image.
  2. Create a Bitmap object of the required size, and scale the original pixel data from the range [0, 65535] to the range [0,255]. Do this because the display range is 0-255. For example, a pixel value of 30000 would become 117. Populate the pixels of the created Bitmap object. Here, there are two possibilities:
    1. using the SetPixel method, or
    2. using BitmapData and the LockBits and UnlockBits methods.

    The latter method requires the use of unsafe code, and is preferred since it is a lot faster than the former. The latter method is used in this application.

  3. Override the Paint method, and display the image using DrawImage.

In the sample application, a Panel object has been used to restrict the dimensions of the displayed image on the screen. Since it may be difficult to get 16-bit raw images, attached are a couple of 16-bit raw images of dimensions 512 x 512 pixels. This application has been built using Visual Studio 2003, and can easily be opened on later versions of Visual Studio. The application is to be built with the unsafe flag on.

Closure

This completes the small and simple application to display a 16-bit image. This application can be expanded to include reading of 8-bit and 16-bit TIFF files, to include scrollbars to navigate through the image, to use double-buffering to avoid flickering, and so on. Complex image processing applications can also be built using this basic structure as a starting point.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
India India
Programming computers since about 1987, my first computer language was Fortran 77. Later I learnt C, C++ and C#. Also programmed a little in VB .Net. Worked with Enterprise Java for a short while. I love watching Kannada movies, and listening to Kannada songs. Currently studying and understanding the Bhagavad Geetha and teaching Sanskrit on YouTube.



Comments and Discussions

 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S15-Nov-15 1:37
professionalAmarnath S15-Nov-15 1:37 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov15-Nov-15 3:25
NickIrtuganov15-Nov-15 3:25 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S22-Nov-15 6:17
professionalAmarnath S22-Nov-15 6:17 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov22-Nov-15 6:23
NickIrtuganov22-Nov-15 6:23 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov29-Nov-15 8:27
NickIrtuganov29-Nov-15 8:27 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S29-Nov-15 17:25
professionalAmarnath S29-Nov-15 17:25 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov30-Nov-15 18:14
NickIrtuganov30-Nov-15 18:14 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S1-Dec-15 17:36
professionalAmarnath S1-Dec-15 17:36 
Caution - This is still work in progress, so it has bugs. However, since I'll busy for the next week or so with other stuff, I'm giving this to you in the state it is now.

Good news: It can read your TIFF file.
Bad news: It does not display that image in this ImageDraw application.
Workaround: This program creates a file called rawFile.raw (within C:\Junk - you need to create such a folder), which you can open using my other WPF-based raw image viewing app, again available on this CP site.

Please use these and let me know of any bugs, suggestions, etc. As I said, I can only look into this after about a week. This is not the best code I write, but parts of it are working, and power will be shut down at my place in 10 minutes Frown | :-(

Here are two source code files: 1. TiffDecoder.cs, and 2. Form1.cs. Include the TiffDecoder.cs in the project, and overwrite the code for Form1.cs

TiffDecoder.cs
C#
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ImageDraw
{
    public class DirectoryEntry
    {
        public ushort tag;
        public ushort type;
        public uint count;
        public uint valueOfOffset;
    }

    public class IFD
    {
        // tags
        //int NEW_SUBFILE_TYPE = 254;
        const ushort IMAGE_WIDTH = 256;
        const ushort IMAGE_LENGTH = 257;
        const ushort BITS_PER_SAMPLE = 258;
        //int COMPRESSION = 259;
        const ushort PHOTO_INTERP = 262;
        const int IMAGE_DESCRIPTION = 270;
        const ushort STRIP_OFFSETS = 273;
        //int ORIENTATION = 274;
        const ushort SAMPLES_PER_PIXEL = 277;
        const ushort ROWS_PER_STRIP = 278;
        const ushort STRIP_BYTE_COUNT = 279;
        //int X_RESOLUTION = 282;
        //int Y_RESOLUTION = 283;
        //int PLANAR_CONFIGURATION = 284;
        //int RESOLUTION_UNIT = 296;
        //int SOFTWARE = 305;
        //int DATE_TIME = 306;
        //int ARTEST = 315;
        //int HOST_COMPUTER = 316;
        //int PREDICTOR = 317;
        //int COLOR_MAP = 320;
        //int TILE_WIDTH = 322;
        //int SAMPLE_FORMAT = 339;
        //int JPEG_TABLES = 347;
        //int METAMORPH1 = 33628;
        //int METAMORPH2 = 33629;
        //int IPLAB = 34122;
        //int NIH_IMAGE_HDR = 43314;
        //int META_DATA_BYTE_COUNTS = 50838; // private tag registered with Adobe
        //int META_DATA = 50839; // private tag registered with Adobe
        
        ushort numberOfEntries;
        List<DirectoryEntry> listEntries;
        BinaryReader bReader;
        TiffDecoder tiffDec;
        List<uint> stripOffsets;
        List<uint> stripByteCounts;

        uint width;
        uint height;
        public uint samplesPerPixel;
        public uint bitsPerSample;
        uint rowsPerStrip;
        public uint photometricInterpretation;

        public List<byte> Pixels8 { get; set; }
        public List<byte> Pixels24 { get; set; } // 8 bits bit depth, 3 samples per pixel
        public List<ushort> Pixels16 { get; set; }
        public List<int> Pixels16Int { get; set; }

        public IFD(BinaryReader br, TiffDecoder tiff)
        {
            bReader = br;
            numberOfEntries = 0;
            tiffDec = tiff;
            listEntries = new List<DirectoryEntry>();
            stripOffsets = new List<uint>();
            stripByteCounts = new List<uint>();
            Pixels16 = new List<ushort>();
        }

        public void ReadIfdAndPixelData() 
        {
            numberOfEntries = bReader.ReadUInt16();
            listEntries.Capacity = numberOfEntries;
            ReadDirectoryEntries();
            InterpretDirectoryEntries();
            ReadPixelData();

            if (samplesPerPixel == 1 && bitsPerSample == 16)
            {
                tiffDec.Pixels16 = Pixels16;

                // Write pixel data to a raw file
                BinaryWriter bw = new 
                    BinaryWriter(new FileStream("C:\\Junk\\rawFile.raw", FileMode.Create));
                for (int i = 0; i < Pixels16.Count; ++i)
                {
                    bw.Write(Pixels16[i]);
                }
                bw.Close();
            }
            else
            {
                // TODO
            }
        }

        DirectoryEntry ReadNextDirectoryEntry()
        {
            DirectoryEntry de = new DirectoryEntry();
            de.tag = bReader.ReadUInt16();
            de.type = bReader.ReadUInt16();
            de.count = bReader.ReadUInt32();
            de.valueOfOffset = bReader.ReadUInt32();
            return de;
        }

        void ReadDirectoryEntries() {
            for (int i = 0; i < numberOfEntries; ++i) {
                DirectoryEntry de = ReadNextDirectoryEntry();
                listEntries.Add(de);
            }
        }

        void PopulateStripOffsets(DirectoryEntry de)
        {
            bReader.BaseStream.Seek(de.valueOfOffset, SeekOrigin.Begin);

            for (int i = 0; i < de.count; ++i)
            {
                uint offset = bReader.ReadUInt32();
                stripOffsets.Add(offset);
            }
        }

        void PopulateStripByteCounts(DirectoryEntry de)
        {
            bReader.BaseStream.Seek(de.valueOfOffset, SeekOrigin.Begin);

            for (int i = 0; i < de.count; ++i)
            {
                uint count = bReader.ReadUInt32();
                stripByteCounts.Add(count);
            }
        }

        void InterpretDirectoryEntries()
        {
            for (int i = 0; i < numberOfEntries; ++i) {
                InterpretDirectoryEntry(listEntries[i]);
            }
        }

        void ReadPixelData()
        {            
            double stripsPerImage = Math.Floor((height + rowsPerStrip - 1.0)/rowsPerStrip);
            uint lastStripNumberOfRows = (uint)(height - rowsPerStrip * ((int)(stripsPerImage) - 1));
            uint offset;
            ushort pixVal;

            if (samplesPerPixel == 1)
            {
                if (bitsPerSample == 16)
                {
                    Pixels16.Clear();

                    for (int i = 0; i < stripsPerImage - 1; ++i)
                    {
                        offset = stripOffsets[i];
                        bReader.BaseStream.Seek(offset, SeekOrigin.Begin);

                        for (int j = 0; j < rowsPerStrip * width; ++j)
                        {
                            pixVal = bReader.ReadUInt16();
                            Pixels16.Add(pixVal);
                        }
                    }

                    // Last strip
                    offset = stripOffsets[stripOffsets.Count - 1];
                    bReader.BaseStream.Seek(offset, SeekOrigin.Begin);
                    for (int j = 0; j < lastStripNumberOfRows * width; ++j)
                    {
                        pixVal = bReader.ReadUInt16();
                        Pixels16.Add(pixVal);
                    }

                    pixVal = 5;
                }
                else
                {
                    // TO DO
                }
            }
            else
            {
                // TO DO
            }
        }

        void InterpretDirectoryEntry(DirectoryEntry de) 
        {
            switch(de.tag) {
                case IMAGE_WIDTH:
                    width = de.valueOfOffset;
                    tiffDec.Width = width;
                    break;
                case IMAGE_LENGTH:
                    height = de.valueOfOffset;
                    tiffDec.Height = height;
                    break;
                case STRIP_OFFSETS:
                    PopulateStripOffsets(de);
                    break;
                case STRIP_BYTE_COUNT:
                    PopulateStripByteCounts(de);
                    break;
                case SAMPLES_PER_PIXEL:
                    samplesPerPixel = de.valueOfOffset;
                    break;
                case BITS_PER_SAMPLE:
                    bitsPerSample = de.valueOfOffset;
                    break;
                case ROWS_PER_STRIP:
                    rowsPerStrip = de.valueOfOffset;
                    break;
                case PHOTO_INTERP:
                    photometricInterpretation = de.valueOfOffset;
                    break;
                default:
                    break;
            }
        }
    }

    public class TiffDecoder
    {
       //constants
        //int UNSIGNED = 1;
        //int SIGNED = 2;
        //int FLOATING_POINT = 3;

        ////field types
        //int SHORT = 3;
        //int LONG = 4;

        // metadata types
        //int MAGIC_NUMBER = 0x494a494a;  // "IJIJ"
        //int INFO = 0x696e666f;  // "info" (Info image property)
        //int LABELS = 0x6c61626c;  // "labl" (slice labels)
        //int RANGES = 0x72616e67;  // "rang" (display ranges)
        //int LUTS = 0x6c757473;  // "luts" (channel LUTs)
        //int ROI = 0x726f6920;  // "roi " (ROI)
        //int OVERLAY = 0x6f766572;  // "over" (overlay)

        //private String directory;
        //private String name;
        //private String url;
        BinaryReader inFile;
        //protected bool debugMode;

        //String dInfo;
        //int ifdCount;
        //int[] metaDataCounts;
        //String tiffMetadata;
        //int photoInterp;

        String tiffFileName;
        bool littleEndian;
        IFD ifd;

        public TiffDecoder()
        {
        }

        public string FileName { get; set; }

        public uint Width { get; set; }

        public uint Height { get; set; }

        public List<ushort> Pixels16 { get;  set; }
                
        int ReadTiffFileHeader()
        {
            // Open 8-byte Image File Header at start of file.
            // Returns the offset in bytes to the first IFD or -1
            // if this is not a valid tiff file.
            int byteOrder = inFile.ReadInt16();
            if (byteOrder == 0x4949) // "II"
                littleEndian = true;
            else if (byteOrder == 0x4d4d) // "MM"
                littleEndian = false;
            else
            {
                // Does not look like a TIFF file
                inFile.Close();
                return -1;
            }
            int magicNumber = inFile.ReadInt16(); // 42
            int offset = inFile.ReadInt32();
            return offset;
        }

        public string TiffFileName
        {
            set
            {
                tiffFileName = value;
                inFile = new BinaryReader(File.Open(tiffFileName, FileMode.Open, FileAccess.Read));

                try
                {
                    int firstIfdOffset = ReadTiffFileHeader();
                    if (firstIfdOffset < 0)
                    {
                        inFile.Close();
                    }
                    if (firstIfdOffset > 0) {
                        inFile.BaseStream.Seek(firstIfdOffset, SeekOrigin.Begin);
                        ifd = new IFD(inFile, this);
                        ifd.ReadIfdAndPixelData();
                    }
                }
                catch
                {
                    // Nothing here
                }
                finally
                {
                    inFile.Close();
                }
            }
        }
    }
}


Form1.cs
C#
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;

// Program to display a 16-bit raw image file.
// Written by Amarnath S, Bangalore, India, December 2008.

namespace ImageDraw
{
	/// <summary>
	/// Summary description for Form1.
	/// 
	/// It is assumed that the pixels comprising the image are stored 
	/// from left to right, and top to bottom, as unsigned short values.
	/// It is also assumed that the width and height of the image are 
	/// identical, so that the image dimensions can be computed by just 
	/// using the square root function.
	/// The algorithm is briefly as follows:
	///  1. Read the raw image file and store the pixel values into an 
	///     ArrayList called pixel16.
	///  2. Create a bitmap of the required dimensions. Create the bitmap 
	///     with the pixel format of Format24bppRgb, and set the red, green 
	///     and blue colors to be identical, since the images are grayscale. 
	///     Scale the 16-bit grayscale interval of 0 - 65535 to an 8-bit 
	///     interval of 0 - 255, since each color is represented by 8 bits. 
	///     Use the BitmapData class to populate the bitmap pixel values 
	///     from the abovementioned pixel16 array list. Use LockBits and 
	///     UnlockBits appropriately. Display the image. It is also 
	///     possible to use SetPixel to set the values, but this method 
	///     is painfully slow compared to what is used here.	
	///  3. Override Paint to draw the image.
	///  
	///  Compile with the unsafe flag on.
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.Panel panelImage;
		private System.Windows.Forms.Button bnOpenImage;
	
		private  List<ushort> pixels16;  // To hold the pixel data
		Graphics g;                   // Graphics of the panel object
		uint      width, height;      // Dimensions of the bitmap
		Bitmap   bmp;                 // Bitmap object

        TiffDecoder tiff;

		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			//
			// Required for Windows Form Designer support
			//
			InitializeComponent();

			//
			// TODO: Add any constructor code after InitializeComponent call
			//
			pixels16 = new List<ushort>();
			g = panelImage.CreateGraphics();
            tiff = new TiffDecoder();
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
            this.bnOpenImage = new System.Windows.Forms.Button();
            this.panelImage = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            // 
            // bnOpenImage
            // 
            this.bnOpenImage.Location = new System.Drawing.Point(8, 8);
            this.bnOpenImage.Name = "bnOpenImage";
            this.bnOpenImage.Size = new System.Drawing.Size(88, 56);
            this.bnOpenImage.TabIndex = 0;
            this.bnOpenImage.Text = "Open Raw Image";
            this.bnOpenImage.Click += new System.EventHandler(this.bnOpenImage_Click);
            // 
            // panelImage
            // 
            this.panelImage.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
            this.panelImage.Location = new System.Drawing.Point(104, 8);
            this.panelImage.Name = "panelImage";
            this.panelImage.Size = new System.Drawing.Size(512, 512);
            this.panelImage.TabIndex = 2;
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(624, 530);
            this.Controls.Add(this.panelImage);
            this.Controls.Add(this.bnOpenImage);
            this.Name = "Form1";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Display 16-bit Raw Image Files";
            this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
            this.ResumeLayout(false);

		}
		#endregion

		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		// Open the Raw image file for reading.
		private void bnOpenImage_Click(object sender, System.EventArgs e)
		{
			pixels16.Clear();
			OpenFileDialog ofd = new OpenFileDialog();
			ofd.Filter = "TIFF Files(*.tif)|*.tif";
			ofd.ShowDialog();
			if( ofd.FileName.Length > 0 )
			{
                tiff.TiffFileName = ofd.FileName;
				//ReadImageFile(ofd.FileName);
                width = tiff.Width;
                height = tiff.Height;

                pixels16 = tiff.Pixels16;
				CreateBitmap();
				Invalidate();
			}
			ofd.Dispose();		
		}

		private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			if( pixels16.Count > 0 )
				g.DrawImage(bmp, 0, 0);
		}

		private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
		{
			bmp.Dispose();
			pixels16.Clear();
		}	

		// Read the image file, and populate the array list pixels16.
		private void ReadImageFile(string fileName)
		{
			BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open));
			ushort pixShort;
			int i;
			long iTotalSize = br.BaseStream.Length;

			for( i = 0; i < iTotalSize; i += 2 )
			{
				pixShort = br.ReadUInt16(); 
				pixels16.Add(pixShort);
			}
			br.Close();
			width = (uint)(Math.Sqrt(pixels16.Count));
			height = width;
		}

		// Create the Bitmap object and populate its pixel data with the stored pixel values.
		private void CreateBitmap()
		{
			bmp = new Bitmap((int)width, (int)height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
			BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, (int)width, (int)height),
				System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);

			// This 'unsafe' part of the code populates the bitmap bmp with data stored in pixel16.
			// It does so using pointers, and therefore the need for 'unsafe'. 
			unsafe
			{
				int    pixelSize = 3;
				int    i, j, j1, i1;
				byte   b;
				ushort sVal;
				double lPixval;

				for (i = 0; i < bmd.Height; ++i)
				{
					byte* row = (byte*)bmd.Scan0 + (i * bmd.Stride);
					i1 = i * bmd.Height;

					for (j = 0; j < bmd.Width; ++j)
					{
						sVal        = (pixels16[i1 + j]);
						lPixval     = (sVal / 256.0); // Convert to a 256 value range
						if( lPixval > 255 ) lPixval = 255;
						if( lPixval < 0   ) lPixval = 0;
						b           = (byte)(lPixval);
						j1          = j * pixelSize;
						row[j1]     = b;            // Red
						row[j1 + 1] = b;            // Green
						row[j1 + 2] = b;            // Blue
					}
				}
			}            
			bmp.UnlockBits(bmd);
		}	
	}
}

GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov2-Dec-15 6:33
NickIrtuganov2-Dec-15 6:33 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov18-Dec-15 8:14
NickIrtuganov18-Dec-15 8:14 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S18-Dec-15 16:44
professionalAmarnath S18-Dec-15 16:44 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov19-Dec-15 6:45
NickIrtuganov19-Dec-15 6:45 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov23-Dec-15 12:21
NickIrtuganov23-Dec-15 12:21 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S23-Dec-15 16:53
professionalAmarnath S23-Dec-15 16:53 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S23-Dec-15 19:02
professionalAmarnath S23-Dec-15 19:02 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov23-Dec-15 23:31
NickIrtuganov23-Dec-15 23:31 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S24-Dec-15 21:19
professionalAmarnath S24-Dec-15 21:19 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov24-Dec-15 21:44
NickIrtuganov24-Dec-15 21:44 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
Amarnath S24-Dec-15 22:33
professionalAmarnath S24-Dec-15 22:33 
GeneralRe: How to extend this program to display 16 bit TIFF file Pin
NickIrtuganov11-Jan-16 6:50
NickIrtuganov11-Jan-16 6:50 
QuestionHow to display an image in the form TIFF (uncompressed) or as raw data using c # Pin
ignasius fajar22-Feb-13 15:46
ignasius fajar22-Feb-13 15:46 
AnswerRe: How to display an image in the form TIFF (uncompressed) or as raw data using c # Pin
Amarnath S24-Feb-13 4:37
professionalAmarnath S24-Feb-13 4:37 
GeneralRe: How to display an image in the form TIFF (uncompressed) or as raw data using c # Pin
ignasius fajar24-Feb-13 15:29
ignasius fajar24-Feb-13 15:29 
GeneralRe: How to display an image in the form TIFF (uncompressed) or as raw data using c # Pin
Amarnath S24-Feb-13 16:24
professionalAmarnath S24-Feb-13 16:24 
GeneralRe: How to display an image in the form TIFF (uncompressed) or as raw data using c # Pin
ignasius fajar24-Feb-13 19:48
ignasius fajar24-Feb-13 19:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.