<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx</link><description>Hi everybody, my name is Roshan Khan and I’m a dev working on Windows Mobile at MS. I’ve been working at the Mobile Devices division for the past 18 months. For the majority of my day I’m working in C++ and on a few unfortunate occasions assembly. Whenever</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8398125</link><pubDate>Tue, 15 Apr 2008 22:45:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8398125</guid><dc:creator>Kevin Daly</dc:creator><description>&lt;p&gt;Very cool, and one of the clearest explanations I've seen of this technique.&lt;/p&gt;
&lt;p&gt;I noticed that you declare and populate a local variable &amp;quot;stride&amp;quot; but don't seem to actually do anything with it...is that an omission that actually makes a difference or did it just turn out not to be needed?&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8398155</link><pubDate>Tue, 15 Apr 2008 23:08:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8398155</guid><dc:creator>RoshanK</dc:creator><description>&lt;p&gt;Nice catch Kevin. The stride value is not needed there. However, it is good to use if you are manipulating smaller portions of the image - or you care about the order the pixels are loaded in. Stride returns the size in bytes of a row of pixels. It also tells you if the pixels are loaded top down or bottom up (positive stride is top down, and negative stride is bottom up IIRC).&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8398220</link><pubDate>Wed, 16 Apr 2008 00:01:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8398220</guid><dc:creator>Bruce Partington</dc:creator><description>&lt;p&gt;are wpf namespaces available on the compact framework, i haven't had time to explore?&lt;/p&gt;
&lt;p&gt;in wpf, bitmapsource takes raw data as input and any filters can be applied without having to use unsafe methods. however we can also expose the underlying wic calls via unsafe methods if needed. using the byte array for processing is very fast and rendering in wpf is also high performance as well.&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8398268</link><pubDate>Wed, 16 Apr 2008 00:50:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8398268</guid><dc:creator>Christopher Fairbairn</dc:creator><description>&lt;p&gt;Bruce, WPF isn't available on the Windows CE or Windows Mobile platform(s) and hence the Compact Framework doesn't support it.&lt;/p&gt;
&lt;p&gt;Silverlight support for Windows Mobile however is aiming for public preview later this year.&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8398314</link><pubDate>Wed, 16 Apr 2008 01:42:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8398314</guid><dc:creator>ramond</dc:creator><description>&lt;p&gt;Marshal.Copy is very expensive, why don't you store the pointer in an instance variable instead of copying all of the data.&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8399081</link><pubDate>Wed, 16 Apr 2008 18:07:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8399081</guid><dc:creator>Matt</dc:creator><description>&lt;p&gt;More posts like this would be much appreciated. &amp;nbsp;Any tricks and improvements that developers don't even realize exist - that's just the kind of thing I need to see. &amp;nbsp;I'll keep subscribing to this RSS feed, just keep coming with the optimized code!&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8419624</link><pubDate>Wed, 23 Apr 2008 21:54:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8419624</guid><dc:creator>Bob</dc:creator><description>&lt;p&gt;Great article! &amp;nbsp;However, it seems your doing some double check locking on your LockPixels and UnlockPixels methods. &amp;nbsp;Would it not be better to either run synchronized ([MethodImpl(MethodImplOptions.Synchronized)]) or lock(this){...}? &lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8421094</link><pubDate>Thu, 24 Apr 2008 10:58:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8421094</guid><dc:creator>panefsky</dc:creator><description>&lt;p&gt;Very informing. thanx&lt;/p&gt;
&lt;p&gt;Please post more often here.&lt;/p&gt;
&lt;p&gt;I am subscribed for some time now but I was expecting this to be a more active blog!&lt;/p&gt;
&lt;p&gt;What's wrong with you people???&lt;/p&gt;
&lt;p&gt;:) just kidding&lt;/p&gt;</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8422604</link><pubDate>Thu, 24 Apr 2008 22:59:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8422604</guid><dc:creator>Eltawil</dc:creator><description>&lt;p&gt;I bet you had a lot of fun working with Assembly :)&lt;/p&gt;</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8432493</link><pubDate>Sun, 27 Apr 2008 21:44:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8432493</guid><dc:creator>Tom</dc:creator><description>&lt;p&gt;Very good article, thanks.&lt;/p&gt;
&lt;p&gt;I wonder how this code perdorms compared to the C++ variant. I guess if I could use BitBlt, etc. directly (and the Invert-Operation with it) it would be much faster - Is this image data internally a DDB oder a DIB - if it is the former one could use BitBlts directly?&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8444439</link><pubDate>Wed, 30 Apr 2008 21:44:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8444439</guid><dc:creator>Synaptime</dc:creator><description>&lt;p&gt;Hi, &lt;/p&gt;
&lt;p&gt;I tried this code out (VS 2005, WinMoPro6 device project)&lt;/p&gt;
&lt;p&gt;I have a very simple setup: A PictureBox (docked full in the form) as the image container, and the PictureBox.Image = new Bitmap(screen width,screen height). &lt;/p&gt;
&lt;p&gt;It takes about a second to invert.&lt;/p&gt;
&lt;p&gt;(both on the emulator, and the actual device)&lt;/p&gt;
&lt;p&gt;Any ideas why so slow?&lt;/p&gt;
&lt;p&gt;thanks&lt;/p&gt;
</description></item><item><title>Few Bugs</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8541924</link><pubDate>Sat, 24 May 2008 01:04:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8541924</guid><dc:creator>Stephen</dc:creator><description>&lt;p&gt;This class has a few bugs in it. &amp;nbsp;(Mainly using width instead of stride).&lt;/p&gt;
&lt;p&gt;Because it got me started I am posting my fixed version. &amp;nbsp;This will work with bitmaps that have a stride that is not exactly = 3 * the width.&lt;/p&gt;
&lt;p&gt;public class FastBitmap&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private Bitmap image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private BitmapData bitmapData;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private byte[] rgbValues;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bool locked = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public int Height&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get { return this.height; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public int Width&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get { return this.width; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public FastBitmap(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = x;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;height = y;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = new Bitmap(x, y);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public FastBitmap(Bitmap bitmap, bool createCopy)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = bitmap.Width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;height = bitmap.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (createCopy == true)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = new Bitmap(bitmap);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = bitmap;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public byte[] GetAllPixels()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return rgbValues;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void SetAllPixels(byte[] pixels)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues = pixels;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public Color GetPixel(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int blue = rgbValues[(y * bitmapData.Stride + (x * 3))];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int green = rgbValues[(y * bitmapData.Stride + (x * 3)) + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int red = rgbValues[(y * bitmapData.Stride + (x * 3)) + 2];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Color.FromArgb(red, green, blue);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void SetPixel(int x, int y, Color cIn)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * bitmapData.Stride + (x * 3))] = cIn.B;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * bitmapData.Stride + (x * 3)) + 1] = cIn.G;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * bitmapData.Stride + (x * 3)) + 2] = cIn.R;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static implicit operator Image(FastBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static implicit operator Bitmap(FastBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void LockPixels()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LockPixels(new Rectangle(0, 0, image.Width, image.Height));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private void LockPixels(Rectangle area)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (locked)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locked = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IntPtr ptr = bitmapData.Scan0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int numBytes = bitmapData.Stride * image.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues = new byte[numBytes];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Marshal.Copy(ptr, rgbValues, 0, numBytes);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void UnlockPixels()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!locked)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locked = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Marshal.Copy(rgbValues, 0, bitmapData.Scan0, image.Width * image.Height * 3);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image.UnlockBits(bitmapData);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8551076</link><pubDate>Sun, 25 May 2008 18:27:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8551076</guid><dc:creator>Klay</dc:creator><description>&lt;p&gt;Maybe I'm misunderstanding something here, but both versions posted seem to be broken.&lt;/p&gt;
&lt;p&gt;Instead of the inversion algorithm, I tried simply creating a new bitmap and setting all pixels to white.&lt;/p&gt;
&lt;p&gt;private void clearImage() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bmp.LockPixels();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;byte[] pixels = bmp.GetAllPixels();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; pixels.Length; i++) {&lt;/p&gt;
&lt;p&gt;	pixels[i] = (byte)(255);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bmp.SetAllPixels(pixels);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bmp.UnlockPixels();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;canvas.Image = bmp;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;If I set the width of the bitmap to something that isn't a multiple of 4, there is a single almost-full scan line of black pixels at the bottom of the image.&lt;/p&gt;
&lt;p&gt;Any fixes?&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8551455</link><pubDate>Sun, 25 May 2008 23:31:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8551455</guid><dc:creator>Stephen</dc:creator><description>&lt;p&gt;You are right Klay. &amp;nbsp;I left in one reference to using Width where it should not have been (in the UnlockPixels() method). &amp;nbsp;This caused it to not copy all of the changed pixels back into to image.&lt;/p&gt;
&lt;p&gt;Here is the correct version of the class.&lt;/p&gt;
&lt;p&gt;public class FastBitmap&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private Bitmap image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private BitmapData bitmapData;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private byte[] rgbValues;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bool locked = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public int Height&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get { return this.height; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public int Width&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get { return this.width; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public FastBitmap(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = x;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;height = y;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = new Bitmap(x, y);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public FastBitmap(Bitmap bitmap, bool createCopy)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = bitmap.Width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;height = bitmap.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (createCopy == true)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = new Bitmap(bitmap);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = bitmap;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public byte[] GetAllPixels()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return rgbValues;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void SetAllPixels(byte[] pixels)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues = pixels;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public Color GetPixel(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int blue = rgbValues[(y * bitmapData.Stride + (x * 3))];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int green = rgbValues[(y * bitmapData.Stride + (x * 3)) + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int red = rgbValues[(y * bitmapData.Stride + (x * 3)) + 2];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Color.FromArgb(red, green, blue);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void SetPixel(int x, int y, Color cIn)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * bitmapData.Stride + (x * 3))] = cIn.B;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * bitmapData.Stride + (x * 3)) + 1] = cIn.G;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * bitmapData.Stride + (x * 3)) + 2] = cIn.R;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static implicit operator Image(FastBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static implicit operator Bitmap(FastBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void LockPixels()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LockPixels(new Rectangle(0, 0, image.Width, image.Height));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private void LockPixels(Rectangle area)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (locked)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locked = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IntPtr ptr = bitmapData.Scan0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int numBytes = bitmapData.Stride * image.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues = new byte[numBytes];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Marshal.Copy(ptr, rgbValues, 0, numBytes);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void UnlockPixels()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!locked)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locked = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Marshal.Copy(rgbValues, 0, bitmapData.Scan0, &amp;nbsp;bitmapData.Stride * image.Height);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image.UnlockBits(bitmapData);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8571357</link><pubDate>Tue, 03 Jun 2008 13:36:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8571357</guid><dc:creator>Paulo Ricca</dc:creator><description>&lt;p&gt;Hey people...&lt;/p&gt;
&lt;p&gt;I was using both RoshanK and Stephen classes and you both missed one thing.&lt;/p&gt;
&lt;p&gt;specially RoshanK, for example:&lt;/p&gt;
&lt;p&gt;public void SetPixel(int x, int y, Color cIn)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * image.Width + x) * 3] = cIn.B;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * image.Width + x) * 3 + 1] = cIn.G;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * image.Width + x) * 3 + 2] = cIn.R;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;You make three references to image.Width. This is a very very slow process. If you want some optimization you could use:&lt;/p&gt;
&lt;p&gt;public void SetPixel(int x, int y, Color cIn)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int w = image.Width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * w + x) * 3] = cIn.B;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * w + x) * 3 + 1] = cIn.G;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * w + x) * 3 + 2] = cIn.R;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;which is much faster, try it! :)&lt;/p&gt;
&lt;p&gt;but... you already have a global variable for Width. so you could use instead:&lt;/p&gt;
&lt;p&gt;public void SetPixel(int x, int y, Color cIn)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int w = width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * w + x) * 3] = cIn.B;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * w + x) * 3 + 1] = cIn.G;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;rgbValues[(y * w + x) * 3 + 2] = cIn.R;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;which is even faster.&lt;/p&gt;
&lt;p&gt;In Stephen's class he uses bitmapData.Stride which is also slow.. so i create a global variable for that and I define is when we lock the pixels, and use it just like I explained before.&lt;/p&gt;
&lt;p&gt;I added some other classes too, in order to access and set the pixels faster, so below is my version of this class.&lt;/p&gt;
&lt;p&gt;These are some common optimization stuff and they work very effectively although they aren't very intuitive. Hope it was useful!&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Runtime.InteropServices;&lt;/p&gt;
&lt;p&gt;using System.Drawing;&lt;/p&gt;
&lt;p&gt;using System.Drawing.Imaging;&lt;/p&gt;
&lt;p&gt;public class FastBitmap&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private Bitmap image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private BitmapData bitmapData;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int stride;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private byte[] rgbValues;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bool locked = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public int Height&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get { return this.height; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public int Width&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get { return this.width; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public FastBitmap(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = x;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;height = y;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = new Bitmap(x, y);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public FastBitmap(Bitmap bitmap, bool createCopy)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = bitmap.Width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;height = bitmap.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (createCopy == true)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = new Bitmap(bitmap);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image = bitmap;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public byte[] GetAllPixels()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return rgbValues;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void SetAllPixels(byte[] pixels)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues = pixels;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public Color GetPixel(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int s = stride;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int blue = rgbValues[(y * s + (x * 3))];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int green = rgbValues[(y * s + (x * 3)) + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int red = rgbValues[(y * s + (x * 3)) + 2];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Color.FromArgb(red, green, blue);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public byte[] GetPixelValues(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int w = width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int s = stride;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] c = new byte[3];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c[2] = rgbValues[(y * s + (x * 3))];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c[1] = rgbValues[(y * s + (x * 3)) + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c[0] = rgbValues[(y * s + (x * 3)) + 2];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void SetPixel(int x, int y, Color cIn)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int s = stride;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * s + (x * 3))] = cIn.B;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * s + (x * 3)) + 1] = cIn.G;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * s + (x * 3)) + 2] = cIn.R;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void SetPixel(int x, int y, byte r, byte g, byte b)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int w = width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int s = stride;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * s + (x * 3))] = b;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * s + (x * 3)) + 1] = g;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues[(y * s + (x * 3)) + 2] = r;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static implicit operator Image(FastBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static implicit operator Bitmap(FastBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.image;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void LockBitmap()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LockBitmap(new Rectangle(0, 0, width, height));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private void LockBitmap(Rectangle area)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (locked) return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locked = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;stride = bitmapData.Stride;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IntPtr ptr = bitmapData.Scan0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int numBytes = bitmapData.Stride * height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues = new byte[numBytes];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Marshal.Copy(ptr, rgbValues, 0, numBytes);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public void UnlockBitmap()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!locked) return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locked = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Marshal.Copy(rgbValues, 0, bitmapData.Scan0, bitmapData.Stride * image.Height);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;image.UnlockBits(bitmapData);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8571360</link><pubDate>Tue, 03 Jun 2008 13:40:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8571360</guid><dc:creator>Paulo Ricca</dc:creator><description>&lt;p&gt;Another thing. I found some months ago a class that was somewhat like this one, which I also changed to become faster and more useful&lt;/p&gt;
&lt;p&gt;I've added the implicit operator too (nice touch, RoshanK ;) )&lt;/p&gt;
&lt;p&gt;I made this class completely compatible with the previous updated version of RoshanK's class, so you can just change the class type from FastBitmap to UnsafeBitmap and allow unsafe code in the project build parameters, and test it in your program. I think its a bit faster, it doesn't use Marshal, and it uses pointers.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Drawing;&lt;/p&gt;
&lt;p&gt;using System.Drawing.Imaging;&lt;/p&gt;
&lt;p&gt;namespace Utility&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public unsafe class UnsafeBitmap&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Bitmap bitmap;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public int Width, Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BitmapData bitmapData = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Byte* pBase = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public UnsafeBitmap(Bitmap bitmap)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.bitmap = new Bitmap(bitmap);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Width = bitmap.Width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Height = bitmap.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public UnsafeBitmap(int width, int height)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Width = bitmap.Width;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Height = bitmap.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Dispose()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmap.Dispose();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public Bitmap Bitmap&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (bitmap);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public struct PixelData&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public byte blue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public byte green;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public byte red;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static bool operator ==(PixelData a, PixelData b)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// If both are null, or both are same instance, return true.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (System.Object.ReferenceEquals(a, b))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// If one is null, but not both, return false.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (((object)a == null) || ((object)b == null))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Return true if the fields match:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return a.red == b.red &amp;amp;&amp;amp; a.green == b.green &amp;amp;&amp;amp; a.blue == b.blue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static bool operator !=(PixelData a, PixelData b)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return !(a == b);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public override bool Equals(object obj)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return base.Equals(obj);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public override int GetHashCode()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return base.GetHashCode();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private Point PixelSize&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Size st = bitmap.Size;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RectangleF bounds = new RectangleF(0, 0, st.Width, st.Height);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new Point((int)bounds.Width, (int)bounds.Height);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void LockBitmap()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RectangleF boundsF = new RectangleF(0, 0, bitmap.Width, bitmap.Height);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Rectangle bounds = new Rectangle(0, 0, bitmap.Width, bitmap.Height);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = (int)boundsF.Width * sizeof(PixelData);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (width % 4 != 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = 4 * (width / 4 + 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmapData = bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pBase = (Byte*)bitmapData.Scan0.ToPointer();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public PixelData GetPixel(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PixelData returnValue = *PixelAt(x, y);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return returnValue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public byte[] GetPixelValues(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] c = new byte[3];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PixelData* returnValue = PixelAt(x, y);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c[0] = returnValue-&amp;gt;red;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c[1] = returnValue-&amp;gt;green;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c[2] = returnValue-&amp;gt;blue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void SetPixel(int x, int y, PixelData color)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PixelData* pixel = PixelAt(x, y);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*pixel = color;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void SetPixel(int x, int y, byte r, byte g, byte b)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PixelData* pixel = PixelAt(x, y);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pixel-&amp;gt;blue = b;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pixel-&amp;gt;green = g;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pixel-&amp;gt;red = r;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void UnlockBitmap()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmap.UnlockBits(bitmapData);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmapData = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pBase = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public PixelData* PixelAt(int x, int y)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (PixelData*)(pBase + y * width + x * sizeof(PixelData));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static implicit operator Image(UnsafeBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.bitmap;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static implicit operator Bitmap(UnsafeBitmap bmp)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bmp.bitmap;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8663073</link><pubDate>Sat, 28 Jun 2008 03:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8663073</guid><dc:creator>cybervedaa</dc:creator><description>&lt;p&gt;guys, i need to draw a random polygon that is semi-transparent. Windows Mobile does not support Color.FromArgb(). is there any other simple workaround to this??&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8678706</link><pubDate>Wed, 02 Jul 2008 00:23:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8678706</guid><dc:creator>Tom</dc:creator><description>&lt;p&gt;hm, I did this by writing my own rasterizer in unmanaged c++ :)&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8681075</link><pubDate>Wed, 02 Jul 2008 13:50:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8681075</guid><dc:creator>Robert</dc:creator><description>&lt;p&gt;like Tom said do yo have to take care of everything by yourself. Seme transparent means that the stuff below the polygon can be seen through it, so you can not fill the polygon with a constant color. For this you need to implement your own fill algorithm which evaluates the color of every pixel of the polygon.&lt;/p&gt;
&lt;p&gt;You could surely do this with the FastBitmap class and draw a polygon onto the FastImage - still you need to implement the filling and drawing by yourself (as long no one posts something to this) :) - but I think it can be done. If you go this way the polygon can only &amp;quot;see&amp;quot; things that are also drawn on the FastImage - it can not see through.&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8689008</link><pubDate>Fri, 04 Jul 2008 15:33:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8689008</guid><dc:creator>Le Sage</dc:creator><description>&lt;p&gt;Hum... weird...&lt;/p&gt;
&lt;p&gt;I'm using either version of the class, &amp;amp; in LockPixels (LockBitmap in Paulo Ricca's version), after the initialisation of the bitmapData, for a 49x49 picture the bitmapData.Stride is said to be 148, but it should be 49*49=147, so I have errors in my image. :-\&lt;/p&gt;
&lt;p&gt;Any idea why?&lt;/p&gt;
&lt;p&gt;Compact framework 2, VS08...&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8763850</link><pubDate>Tue, 22 Jul 2008 15:32:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8763850</guid><dc:creator>Le Sage</dc:creator><description>&lt;p&gt;Answer to myself (&amp;amp; to whom it might help) : the stride (number of bytes occupied by a row) HAS TO be a multiple of 4 bytes (don't ask me why), see the MSDN : &lt;a rel="nofollow" target="_new" href="http://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.stride.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.stride.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;The stride is the width of a single row of pixels (a scan line), rounded up to a four-byte boundary.&amp;quot;&lt;/p&gt;
&lt;p&gt;That's why sometimes after the first row there is a data shift in some pictures manually created. :)&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8800067</link><pubDate>Fri, 01 Aug 2008 17:34:36 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8800067</guid><dc:creator>Max</dc:creator><description>&lt;p&gt;Hi guys, just a question why i get a ArgumentException when i excute this code :&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Bitmap enfin = (Bitmap)image.Clone();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitmapData = enfin.LockBits(rec, ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);&lt;/p&gt;
&lt;p&gt;Thank you&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8834728</link><pubDate>Tue, 05 Aug 2008 22:15:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8834728</guid><dc:creator>Patrick Scott</dc:creator><description>&lt;p&gt;the only thing that I can see to improve the calculation is to change&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void LockBitmap()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((width &amp;amp; 3) != 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;width = (width ^ 3) + 4;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;since binary operators should be faster than division&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8834751</link><pubDate>Tue, 05 Aug 2008 22:23:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8834751</guid><dc:creator>Patrick Scott</dc:creator><description>&lt;p&gt;I believe Le Sage wonder why groups of 4 bytes and if I remember correctly it &lt;/p&gt;
&lt;p&gt;first byte =&amp;gt; shades of gray&lt;/p&gt;
&lt;p&gt;second byte =&amp;gt; shades of red&lt;/p&gt;
&lt;p&gt;third byte =&amp;gt; shades of green&lt;/p&gt;
&lt;p&gt;forth byte =&amp;gt; shades of blue&lt;/p&gt;
&lt;p&gt;with 0 thru 255 possible shades for each&lt;/p&gt;</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8834760</link><pubDate>Tue, 05 Aug 2008 22:30:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8834760</guid><dc:creator>Patrick Scott</dc:creator><description>&lt;p&gt;Great blog! &amp;nbsp;I was able to understand and I got the code to work! &amp;nbsp;Can't beat that.&lt;/p&gt;
&lt;p&gt;Keep up the great work.&lt;/p&gt;
&lt;p&gt;From an old C programmer.&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8836399</link><pubDate>Wed, 06 Aug 2008 10:13:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8836399</guid><dc:creator>Yogusmilu</dc:creator><description>&lt;p&gt;What Paulo Ricco is very much true &lt;/p&gt;
&lt;p&gt;if RoshanK had already declared the global variable then why cant be use this.&lt;/p&gt;
&lt;p&gt;This is really faster and good piece of code.&lt;/p&gt;
&lt;p&gt;public void SetPixel(int x, int y, Color cIn)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; int w = width;&lt;/p&gt;
&lt;p&gt; rgbValues[(y * w + x) * 3] = cIn.B;&lt;/p&gt;
&lt;p&gt; rgbValues[(y * w + x) * 3 + 1] = cIn.G;&lt;/p&gt;
&lt;p&gt; rgbValues[(y * w + x) * 3 + 2] = cIn.R;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Thanks &lt;/p&gt;
&lt;p&gt;Yogusmilu&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8869117</link><pubDate>Fri, 15 Aug 2008 11:39:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8869117</guid><dc:creator>crafty</dc:creator><description>&lt;p&gt;@cybervedaa &lt;/p&gt;
&lt;p&gt;I'd look at P/Invoking the AlphaBlend function. &amp;nbsp;See here: &amp;nbsp;&lt;a rel="nofollow" target="_new" href="http://blogs.msdn.com/chrislorton/archive/2006/04/07/570649.aspx"&gt;http://blogs.msdn.com/chrislorton/archive/2006/04/07/570649.aspx&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8870248</link><pubDate>Fri, 15 Aug 2008 20:41:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8870248</guid><dc:creator>RoshanK</dc:creator><description>&lt;p&gt;Unfortunatly P/Invoke is slow. You are going to take a big hit for using it.&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#8953639</link><pubDate>Tue, 16 Sep 2008 11:20:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8953639</guid><dc:creator>romario</dc:creator><description>&lt;p&gt;hi all,&lt;/p&gt;
&lt;p&gt;1st of thanks for the lesson and the comments. one questio, how can I merge text to the bitmap? (for intace the date)&lt;/p&gt;
</description></item><item><title>re: Faster C#</title><link>http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx#9484578</link><pubDate>Tue, 17 Mar 2009 22:45:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9484578</guid><dc:creator>Karina</dc:creator><description>&lt;p&gt;Hii all &lt;/p&gt;
&lt;p&gt;I thingk about. I have 2 function &lt;/p&gt;
&lt;p&gt; public void LockBit()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Lock the bitmap's bits. &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Rectangle rect = new Rectangle(0, 0, input_image_width, input_image_height);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bmdata = input_image.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); //bmdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int RowsByte = bmdata.Stride;//so byte tren 1 hang&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int TotalSize = RowsByte * bmdata.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rgbValues = new byte[TotalSize];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Get the address of the first line.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IntPtr ptr = bmdata.Scan0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, TotalSize);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // MessageBox.Show(RowsByte.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//MessageBox.Show(i.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void UnLockBit()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int TotalSize = bmdata.Stride * bmdata.Height;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//byte[] rgbValues = new byte[TotalSize];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Get the address of the first line.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IntPtr ptr = bmdata.Scan0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, TotalSize);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input_image.UnlockBits(bmdata);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;and after i using &lt;/p&gt;
&lt;p&gt; LockBit();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; rgbValues.Length-2; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//rgbValues[i] = (byte)(255 - rgbValues[i]); &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rgbValues[i] = (byte)(rgbValues[i]/3+rgbValues[i+1]/3+rgbValues[i+2]/3);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UnLockBit();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pictureBox1.Refresh();&lt;/p&gt;
&lt;p&gt;this oke and verry fast&lt;/p&gt;
</description></item></channel></rss>