none
Bagaimana menampilkan images .tiff(uncompressed) / raw data dengan C#? RRS feed

  • Pertanyaan

  • Bagaimana cara menampilkan gambar .tiff(uncompressed) / raw data dengan C#? gambar ini saya dapatkan dari mesin x-ray dan hanya bisa dibuka dengan mengggunakan software imagej (http://rsb.info.nih.gov/ij/), contoh image yang akan di buka sudah saya upload di : https://www.dropbox.com/s/z75v3v37bkhmvw7/tes.tiff 

    Mohon bantuanya untuk memecahkan permasalahan saya ini....

    Kamis, 28 Februari 2013 02.46

Jawaban

  • Anda bisa gunakan library pihak ketiga seperti http://bitmiracle.com/libtiff/ untuk memanipulasi file TIFF.

    Anda bisa convert TIFF ke JPEG, PNG atau BMP untuk menampilkan gambar dengan viewer standar.


    Ahmad Masykur http://www.masykur.web.id/

    • Ditandai sebagai Jawaban oleh ignasius fajar Kamis, 14 Maret 2013 03.11
    Kamis, 28 Februari 2013 08.51
  • Wah...

    Kembali ke jawaban saya sebelumnya, mas.

    Saya sarankan untuk memakai System.Windows.Media.Imaging, bukan System.Drawing.Imaging.

    Karena System.Drawing.Imaging memakai API di Windows GDI+, berbeda dengan System.Windows.Media.Imaging yang memakai API Windows Image Acquisition (WIA) yang lebih akurat dan menyediakan decoder and encoder TIFF yang lebih lengkap. Performance WIA juga lebih cepat.

    API WIA hanya tersedia di Windows Vista keatas (termasuk Windows 7 dan Windows 8), tetapi fasilitas dan fiturnya lebih banyak dan mendukung TIFF yang dapat disetting lebih spesifik.

    Anda bisa memakai System.Windows.Media.Imaging di Windows Forms, tetapi disarankan memakai WPF karena untuk redraw di WPF lebih cepat dan lebih halus karena memakai DirectX di background.


    Rabu, 06 Maret 2013 03.40

Semua Balasan

  • Anda bisa gunakan library pihak ketiga seperti http://bitmiracle.com/libtiff/ untuk memanipulasi file TIFF.

    Anda bisa convert TIFF ke JPEG, PNG atau BMP untuk menampilkan gambar dengan viewer standar.


    Ahmad Masykur http://www.masykur.web.id/

    • Ditandai sebagai Jawaban oleh ignasius fajar Kamis, 14 Maret 2013 03.11
    Kamis, 28 Februari 2013 08.51
  • Bagaimana cara menampilkan gambar .tiff(uncompressed) / raw data dengan C#? gambar ini saya dapatkan dari mesin x-ray dan hanya bisa dibuka dengan mengggunakan software imagej (http://rsb.info.nih.gov/ij/), contoh image yang akan di buka sudah saya upload di : https://www.dropbox.com/s/z75v3v37bkhmvw7/tes.tiff 

    Mohon bantuanya untuk memecahkan permasalahan saya ini....

    Anda bisa membuka file TIFF secara langsung tanpa software lain atau 3rd party, dengan memakai class TiffBitmapDecoder, yang tersedia sejak .NET Framework  3.0.

    Class ini terdapat di namespace System.Windows.Imaging yang merupakan namespace dari lapisan teknologi WPF.

    Untuk cara pemakaian dan contoh lebih lengkap, silakan lihat di:

    http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.tiffbitmapdecoder.aspx

    ------------------------------------------------

    Eriawan Kusumawardhono, http://mugi.or.id/blogs/eriawan/

    Kamis, 28 Februari 2013 16.13
  • Apakah ini berlaku juga untuk membaca image .tiff uncompress / raw data dari mesin x-ray??

    Saya mendapatkan script seperti ini, gambar sudah mulai terlihat namun belum sempurna, apakah anda bisa membantu saya untuk menyempurnakannya?

    Berikut contoh scriptnya :

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Drawing.Imaging;
    using System.IO;


    namespace ImageDraw
    {

    public class Form1 : System.Windows.Forms.Form
    {
    private System.Windows.Forms.Panel panelImage;
    private System.Windows.Forms.Button bnOpenImage;

    private  ArrayList pixels16;  // To hold the pixel data
    Graphics g;                   // Graphics of the panel object
    int      width, height;       // Dimensions of the bitmap
    Bitmap   bmp;                 // Bitmap object

    /// <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 ArrayList();
    g = panelImage.CreateGraphics();
    }

    /// <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(79, 28);
                this.bnOpenImage.TabIndex = 0;
                this.bnOpenImage.Text = "Proses";
                this.bnOpenImage.Click += new System.EventHandler(this.bnOpenImage_Click);
                // 
                // panelImage
                // 
                this.panelImage.AutoSize = true;
                this.panelImage.Location = new System.Drawing.Point(8, 45);
                this.panelImage.Name = "panelImage";
                this.panelImage.Size = new System.Drawing.Size(608, 475);
                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.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);
                this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
                this.ResumeLayout(false);
                this.PerformLayout();

    }
    #endregion


    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    }


    private void bnOpenImage_Click(object sender, System.EventArgs e)
    {
                

                pixels16.Clear();
                OpenFileDialog ofd = new OpenFileDialog();
                //ofd.Filter = "All Files(*.*)|*.*";
                //ofd.ShowDialog();
                if ("Gambar format TIFF\\tes.tiff".Length > 0)
                {
                    ReadImageFile("Gambar format TIFF\\tes.tiff");
                    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 )
                for (i = 0; i < iTotalSize; i += 2)
    {
    pixShort = (ushort)(br.ReadInt16()); 
    pixels16.Add(pixShort);
    }
    br.Close();
                width = (int)((Math.Sqrt(pixels16.Count)) - 16);
                height = width - 16;

    // Create the Bitmap object and populate its pixel data with the stored pixel values.
    private void CreateBitmap()
    {
    //bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, width, 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 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        = (ushort)(pixels16[i1 + j]);
    //lPixval     = (sVal / 255.0); // Convert to a 255 value range
                            lPixval = (sVal/255);
    //if( lPixval > 255 ) lPixval = 255;
                            if (lPixval > 255) lPixval = 65535;
    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);
    }
    }
    }


    • Diedit oleh ignasius fajar Rabu, 06 Maret 2013 03.18 menghilangkan beberapa mark yg tidak terpakai
    Rabu, 06 Maret 2013 03.16
  • Wah...

    Kembali ke jawaban saya sebelumnya, mas.

    Saya sarankan untuk memakai System.Windows.Media.Imaging, bukan System.Drawing.Imaging.

    Karena System.Drawing.Imaging memakai API di Windows GDI+, berbeda dengan System.Windows.Media.Imaging yang memakai API Windows Image Acquisition (WIA) yang lebih akurat dan menyediakan decoder and encoder TIFF yang lebih lengkap. Performance WIA juga lebih cepat.

    API WIA hanya tersedia di Windows Vista keatas (termasuk Windows 7 dan Windows 8), tetapi fasilitas dan fiturnya lebih banyak dan mendukung TIFF yang dapat disetting lebih spesifik.

    Anda bisa memakai System.Windows.Media.Imaging di Windows Forms, tetapi disarankan memakai WPF karena untuk redraw di WPF lebih cepat dan lebih halus karena memakai DirectX di background.


    Rabu, 06 Maret 2013 03.40
  • Oiya Pak erwan maaf saya juga mau bertanya, apakah WPF bisa dimasukan ke dalam windows Form, karena Project yg saya gunakan menggunakan Windows Form bukan WPF, Saya coba untuk memasukan System.Windows.Media.Imaging  pada windows form keluar eror "The type or namespace name 'Media' does not exist in the namespace 'System.Windows' (are you missing an assembly reference?)". Bagaimana cara saya menambahkannya ya??

    Oiya tadi saya sempat menggunakan contoh WPF dari contoh tutorial yang bapak berikan di link berikut : http://msdn.microsoft.com/en-us/library/ms771367(v=vs.85).aspx

    namun setelah saya gunakan contoh image saya, keluar pesan eror "No imaging component suitable to complete this operation was found."

    Terima Kasih.....

    • Diedit oleh ignasius fajar Kamis, 07 Maret 2013 02.09 setelah dicoba
    Kamis, 07 Maret 2013 01.02
  • Begini, saya akan mengkonfirmasi dulu beberapa hal yah?

    Anda memakai Visual Studio versi berapa? Karena WPF membutuhkan minimal .NET 3.0 dan versi Visual Studio yang mendukung WPF secara penuh adalah Visual Studio 2008. Jika anda memakai Visual Studio 2005, maka WPF tidak didukung secara penuh.

    Jika anda membuat project Windows Forms, saya sarankan dibuat di Visual Studio 2008 dan target .NET adalah .NET 3.5 (karena .NET 3.5 adalah versi default template dan berisikan update dan bugfix WPF).

    Setelah itu, anda tambahkan reference WPF ke project anda, karena Windows Forms secara default tidak memasukkan DLL WPF ke dalam project Windows Forms.

    Namespace System.Windows.Media.Imaging terdapat pada PresentationCore.dll dan WindowsBase.dll (karena dua file ini saling terkait). File ini tersedia pada global assembly cache.

    Untuk menambahkan reference di C# VS 2008:

    http://msdn.microsoft.com/en-us/library/7314433t(v=vs.90).aspx

    Jika ada error, errornya dimana dan code anda seperti apa?

    Kamis, 07 Maret 2013 03.00
  • saya menggunakan VS 2012...

    Saya mengalami eror setelah mengganti gambar yang saya miliki pada line ke 64, yaitu:

    "TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);"

    Dengan pesan error :

    "No imaging component suitable to complete this operation was found."

    Jumat, 08 Maret 2013 04.10
  • Kalau error itu ada kemungkinan registry anda bermasalah. Apakah anda melakukan instalasi software untuk image editor sebelumnya? Jika iya, maka ada kemungkinan registry berubah.

    Coba jalankan script untuk memperbaiki registry anda.

    Script ini silakan didownload di:

    http://swimmingpooldotnet.wordpress.com/2010/08/09/wpf-error-no-imaging-component-suitable-to-complete-this-operation-was-found/

    Silakan mencoba!

    regards,

    Eriawan Kusumawardhono

    Jumat, 08 Maret 2013 09.51
  • Setelah saya coba menggunakan bitmiracle, gambar dapat terbuka namun tidak sempurna.... saya menggunakan samples yang ini : "http://bitmiracle.com/libtiff/help/copy-and-rotate-tiff-data.aspx"

    namun hasilnya gambar terpotong berwarna hitam pada bagian bawah, seperti berikut :

    Mohon bantuannya agar gambar dapat ditampilkan sempurna.

    Thnx

    Kamis, 14 Maret 2013 04.09