Manipulasi Citra Menggunakan LockBits (C#)
Ditulis oleh A.D Setiawan di/pada April 21, 2008
Beberapa hari ini saya ngoprek manipulasi citra menggunakan C#. Class yang biasa digunakan untuk menampung data citra adalah class Bitmap. Sialnya class Bitmap ini secara default digunakan untuk citra RGB, sedangkan citra yang saya gunakan adalah citra grayscale 8 bit. OK, ternyata untuk citra grayscale nilai-nilai dari layer R, G, dan B sama dan berkisar antara 0-255 (2^8). Beres …. lalu saya ingin memanipulasi nilai warna suatu piksel tertentu. Saya ganti saja menggunakan method setPixel … WAH error .. (merah). Ah ternyata ada suatu cara untuk menggantikan nilai suatu piksel, yaitu menggunakan method lockBits pada class Bitmap.
Idenya adalah dengan mengubah Bitmap ke managed memory menggunakan method lockBits, lalu copy-kan nilai2nya ke sebuah unmanaged memory berupa array. Nah array inilah yang kita ubah-ubah nilainya. Untuk format pixel 8bpp, setiap elemen array merepresentasikan sebuah pixel. Berbeda jika format citranya adalah 24bpp, setiap piksel diwakili oleh 3 buah elemen array yang merepresentasikan nilai R, G, dan B. Setelah perubahan nilai pada array dilakukan, kita kembalikan nilai-nilai pada array ke managed memory. Setelah itu diubah ke Bitmap menggunakan unlockBits. Pengcopyan nilai dari managed memory ke unmanaged memory (array) dapat dilakukan menggunkan method copy di class Marshal.
Berikut ini adalah cuplikan source program. Kode berikut ini me-load citra ke dalam kelas Bitmap
Bitmap citra = new Bitmap("lena512.bmp");
Selanjutnya objek citra yang merupakan instansiasi dari kelas Bitmap. Objek ini dapat ditampilkan menggunakan beberapa teknik. Salah satunya adalah menggunakan picture box.
mPictureBox.Image = citra;
Citra yang kita gunakan adalah lena512.bmp dengan dimensi 512 x 512 seperti yang ditunjukan oleh gambar berikut (saya tampilkan potongannya saja)
Kemudian nilai-nilai warna (0-255) yang tersimpan di objek citra kita pindahkan ke managed memory menggunakan method lockBits
// lockbits citra -> memori
BitmapData dataCitra =
citra.LockBits(new Rectangle(0,0,
citra.Width,citra.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format8bppIndexed);
Data-data warna disimpan ke dalam objek dataCitra dengan address awal scan0. Selanjutnya kita siapkan sebuah array 1 dimensi dengan panjang = lebar citra x tinggi citra untuk menampung data warna dari objek dataCitra. Pada array inilah (yang kita beri nama colorVarArr) kita melakukan manipulasi warna-warna citra. Penyalinan data dari managed memory (dataCitra) ke unmanaged memory (colorVarArr) dapat kita lakukan dengan memanggil method copy pada kelas Marshal dengan constructor public static void Copy (IntPtr source, byte[] destination, int startIndex, int length)
// dapatkan address awal
IntPtr addressAwal = dataCitra.Scan0;
int ukuranArrCitra = citra.Width * citra.Height;
byte[] colorValArr = new byte[ukuranArrCitra];
// Cp data from an unmanaged memory ptr to
// a managed 8-bit unsigned integer arr
System.Runtime.InteropServices.Marshal.Copy(
addressAwal, colorValArr,
0, ukuranArrCitra);
Selanjutnya tinggal mengimplementasikan operasi manipulasi pada citra. Pada contoh kali ini saya akan mengubah warna citra menjadi hitam pada 20 baris teratas.
// manipulasi citra
for (int i = 0; i < 10240; i++) {
colorValArr[i] = 0;
}
Setelah operasi manipulasi citra selesai dilakukan kembalikan lagi nilai-nilai pada array ke managed memory (dataCitra) menggunakan method copy pada kelas Marshal. Lalu kembalikan nilai-nilai pada managed memory (dataCitra) ke objek citra (kelas Bitmap) menggunakan method unlockBits dengan constructor public static void Copy (byte[] source, int startIndex, IntPtr destination, int length). Kemudian tampilkan kembali ke picture box.
// Cps data from a 1 dim managed 8-bit unsigned
// int array to an unmanaged mem ptr.
System.Runtime.InteropServices.Marshal.Copy(
colorValArr, 0,
addressAwal,ukuranArrCitra);
// unlock bits
citra.UnlockBits(dataCitra);
mPictureBox.Image = citra;
Hasilnya dapat dilihat pada gambar berikut ini. Terlihat warna pada 20 baris pertama berwarna hitam
Semoga bermanfaat …



Joko berkata
Wah terima kasih … saya juga mengalami masalah yang sama, jadi dapat pencerahan nij … thx ya
Menampilkan Citra Bitmap dari Array « Human Knowledge belongs to The World … berkata
[...] Citra Bitmap dari Array Menindaklanjuti post sebelumnya tentang citra bitmap di C# programming, ada beberapa pertanyaan yang muncul. Bagaimana kita [...]