A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
Go Back  Xtreme Visual Basic Talk > > > A faster way that .SetPixel to draw a bitmap?


Reply
 
Thread Tools Display Modes
  #1  
Old 11-08-2006, 08:25 AM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default A faster way that .SetPixel to draw a bitmap?


I am using the .setpixel methood to create a bitmap from a datastream. The files are not that big...but it takes about 1 minute to finish it. Is there a faster way to draw a back and white bitmap?

dim bm as bitmap

for x = 1 to bm.width
for y = 1 to dm.height
bm.setpixel(x,y,color.fromagrib)
next
next
Reply With Quote
  #2  
Old 11-08-2006, 03:22 PM
MikeJ's Avatar
MikeJA faster way that .SetPixel to draw a bitmap? MikeJ is offline
Retread

Retired Moderator
* Expert *
 
Join Date: Sep 2002
Location: Austin, Texas
Posts: 6,747
Default

Do you mean like a black and white pattern? Like this?
Code:
*o*o
o*o*
*o*o
o*o*

* being a black pixel and o being a white pixel
__________________
{ Lex Fori } { Locus Classicus } { Rutilus Scrinium }
Osculare pultem meam!
Reply With Quote
  #3  
Old 11-08-2006, 03:29 PM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

Bitmapdata, Lockbits, Marshal.copy are your friends. They are also tricky to get used to...

This example copies an array of random integers to a bitmap. We specify 32 bits per pixel - so 1 int is 1 pixel. If you are using another format then things get tricky...

Code:
Imports System.Drawing.imaging Imports System.Runtime.InteropServices Public Class Form1 ' Purpose: Copy an integer array representing pixel data to a bitmap quickly. Private randomColors() As Integer Private bm As Bitmap Private WithEvents b As Button Private rGenerator As Random Private pixelCount As Integer Sub New() InitializeComponent() Me.DoubleBuffered = True b = New Button Me.Controls.Add(b) Me.WindowState = FormWindowState.Maximized rGenerator = New Random End Sub Private Sub FillRandomBits(ByVal numberToGet) randomColors = New Integer(numberToGet - 1) {} For i As Integer = 0 To numberToGet - 1 randomColors(i) = rGenerator.Next Next End Sub Private Sub b_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles b.Click bm = New Bitmap(Me.Width - 1, Me.Height - 1) pixelCount = bm.Width * bm.Height FillRandomBits(pixelCount - 1) CreateImage() End Sub Private Sub CreateImage() ' the size of the bitmap is important ' the format of the colors is important ' was it 32bits per color or 24 (or others...) Dim bmd As BitmapData = _ bm.LockBits(New Rectangle(0, 0, bm.Width, bm.Height), _ ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb) Marshal.Copy(randomColors, 0, bmd.Scan0, randomColors.Length) bm.UnlockBits(bmd) Me.Refresh() End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint If bm IsNot Nothing Then e.Graphics.DrawImageUnscaled(bm, New Point(0, 0)) End If End Sub End Class
Reply With Quote
  #4  
Old 11-08-2006, 11:32 PM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

I am trying to compare your code to mine. I wonder if there is a way to merge them? I basically have the bytes in an array (mybuffer) that I got from a stream. I then create a color.fromArgb and them set the pixel.

dim Histogram(256) as new integer {}

Dim gray As Integer = 0
Dim y As Integer = 0

While y < ImageHeight
Dim x As Integer = 0
While x < ImageWidth

gray = mybuffer(System.Math.Min(System.Threading.Interlocked.Increment(byteco unt), bytecount - 1))

System.Math.Min(System.Threading.Interlocked.Increment(Histogram(gray) ), Histogram(gray) - 1)

Dim mycolor As Color = Color.FromArgb(gray, gray, gray)

myImage.SetPixel(x, y, mycolor)





System.Math.Min(System.Threading.Interlocked.Increment(x), x - 1)
End While
System.Math.Min(System.Threading.Interlocked.Increment(y), y - 1)
End While

Last edited by bonedoc; 11-09-2006 at 01:27 AM.
Reply With Quote
  #5  
Old 11-09-2006, 08:26 PM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

<Scratches head />
This System.Math.Min(System.Threading.Interlocked.Increment stuff is weird.
I googled it, and found a few people "using" it.

In c/c++/c# you can increment the variable i and assign the value to another variable at the same time:
int j = ++i;
int j = i++;
the difference is that one returns the value of i before it is incremented, and the other returns the value of i after it is incremented. VB hasn't got those, so I suspect a code converter has had a go at it...
Code:
gray = mybuffer(System.Math.Min(System.Threading.Interlocked.Increment(bytecount), bytecount - 1))
is just

gray = myBuffer(bytecount++);

To retranslate it...
Code:
For y As Integer = 0 To imageHeight - 1 For x As Integer = 0 To imageWidth - 1 ' get the gray value from the array gray = myBuffer(byteCount) ' seems like you are keeping count of the gray values used in the image. Histogram(gray) = Histogram(gray) + 1 ' create the gray color Dim mycolor As Color = Color.FromArgb(gray, gray, gray) ' write it to the image myImage.SetPixel(x, y, mycolor) Next Next

It looks like you have all the ingredients you need. You know the format of the data, it is 1 byte per pixel, and the width and height of the image.
My example just needs a couple of alterations..
Code:
Imports System.Drawing.Imaging Imports System.Runtime.InteropServices Public Class Form1 Private myBuffer() As Byte Private myImage As Bitmap Private b As Button Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() Me.DoubleBuffered = True ' Here we say the bitmap is 32 bits per pixel ARGB. myImage = New Bitmap(500, 500, PixelFormat.Format32bppArgb) ' Instantiate myBuffer. It needs to be exactly the right size. ' As vb arrays are 0 based Dim myBuffer(0) could hold 1 element. ' We have width * height pixels, so we need to dimension the array ' to width * height - 1: myBuffer = New Byte(myImage.Width * myImage.Height - 1) {} b = New Button Me.Controls.Add(b) AddHandler b.Click, AddressOf BClick End Sub Sub BClick(ByVal s As Object, ByVal e As EventArgs) ' fill the buffer up with data. We use random junk... System.Security.Cryptography.RandomNumberGenerator.Create().GetBytes(myBuffer) CreateImage() Me.Refresh() End Sub Sub CreateImage() ' Ok, we want to send bytes from myBuffer to the bitmap. ' the image must be the right size, the arrays must be the right size. ' First lockbits. This locks the data in the image so that no-one else can touch it, ' and so that it doesn't get shifted to another area of memory. Dim bmd As BitmapData = myImage.LockBits(New Rectangle(0, 0, myImage.Width, myImage.Height), _ ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb) ' So we have 1 byte per pixel in myBuffer, but we need 4 bytes per pixel in the image... ' 4 bytes is an integer, so make an array of integers, the same size as myBuffer: Dim pixelData(myBuffer.Length - 1) As Int32 ' Copy the data across: For i As Integer = 0 To myBuffer.Length - 1 ' To some bit manipulation to create an integer out of four grey bytes. ' This way is faster than using the Color class. ' The alpha channel should be 255 so that it is fully visible. ' Gray needs to go into the other three bytes. ' We need to put gray into an integer first, otherwise there is no room to do bitshifts. Dim gray As Integer = myBuffer(i) ' Histogram(gray) stuff can go in here. pixelData(i) = &HFF000000 Or (gray << 16) Or (gray << 8) Or gray Next ' And copy to the bitmap Marshal.Copy(pixelData, 0, bmd.Scan0, pixelData.Length) ' unlock myImage.UnlockBits(bmd) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint e.Graphics.Clear(Color.AliceBlue) If myImage IsNot Nothing Then e.Graphics.DrawImageUnscaled(myImage, New Point(0, 0)) End If End Sub End Class

Last edited by jo0ls; 11-10-2006 at 06:48 AM.
Reply With Quote
  #6  
Old 11-09-2006, 09:59 PM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

Thanks for your help! I just have a couple questions. What is going on in that randomization code? It looks like it is choosing random colors or something.

It seems like the code is running, but it turns the entire picturebox i am drawing on black. Do you know what would cause this? I wonder if the gray colors are wrong or something.

...sorry for all the questions, I am new in this area. Ian

Last edited by bonedoc; 11-09-2006 at 11:12 PM.
Reply With Quote
  #7  
Old 11-10-2006, 06:56 AM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

There's a couple of ways to generate random numbers, I was playing with both. I've taken out the instance of the random class that wasn't actually doing anything.
All this does:
Code:
System.Security.Cryptography.RandomNumberGenerator.Create().GetBytes(m yBuffer)
Is to fill the array myBuffer with random bytes. This is to simulate the data that you have in myBuffer. The resulting image is like an untuned TV. Obviously you don't need to use any random class, just use the data you have already put into myBuffer.

The only code you need to use is the stuff in CreateImage. Make sure you have myImage set to the right dimensions, and myBuffer is full of data first.
Reply With Quote
  #8  
Old 11-10-2006, 12:06 PM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

Quote:
Originally Posted by jo0ls
There's a couple of ways to generate random numbers, I was playing with both. I've taken out the instance of the random class that wasn't actually doing anything.
All this does:
Code:
System.Security.Cryptography.RandomNumberGenerator.Create().GetBytes(m yBuffer)
Is to fill the array myBuffer with random bytes. This is to simulate the data that you have in myBuffer. The resulting image is like an untuned TV. Obviously you don't need to use any random class, just use the data you have already put into myBuffer.

The only code you need to use is the stuff in CreateImage. Make sure you have myImage set to the right dimensions, and myBuffer is full of data first.
Ok, I got things running good. Thanks for your help! I am encountering 1 error. Occasional, when I get to Marshall.Copy, I get

"Attemped to read or write protected memory. Often an inication that another memory is corrupt". I guess what I was forgetting is that the image I am reading is in the middle of the buffer, not the begining...do it was overdoing the array. It seems all is going good. Thanks for your help!!! I may have some questions later.

Last edited by bonedoc; 11-10-2006 at 12:55 PM.
Reply With Quote
  #9  
Old 11-10-2006, 01:05 PM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

It sounds like you are trying to copy too much data into the image. If the array of integers is too big, then marshal.copy will be trying to write values into memory that is not locked in the bitmapdata object. It's not allowed...

That error drummed into my head that vb arrays are 0 based:

Dim myArray(0) as integer
has room for 1 integer..

So if you have n pixels worth of data, the array should be size with
Dim myArray(n - 1) to store n integers.

If you get it wrong, then that error will appear as you try to copy 1 extra int into protected memory.
Reply With Quote
  #10  
Old 11-10-2006, 03:04 PM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

Thanks, I think I have that worked out now. I have one last question. In your code, there are 4 values of gray you are giving to the pixelData Array. What does this mean?

Also, I am reading tags that give information about the image I am reading. One of the tags specifies ImageBytesStored. The original code I gave you was for 8 or less bits per pixel. But, there are also higher ImageBytesStored..like 10,12, or 16.....In this case, I set a pixel and then I move 2 bytes forward, Instead of 1 like the <8 Byte code. With 10,12, and 16 byte I would get the gray value, and then divide it by the ImageBitsStored to get the gray color, and then go 2 bytes forward. How can I apply it to the code you are showing...if I make sense. The 8 ImageBytesStored images look awesome, but the others are jacked up. Any thoughts? Thanks again!

Last edited by bonedoc; 11-10-2006 at 03:40 PM.
Reply With Quote
  #11  
Old 11-11-2006, 12:26 PM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

It uses a 32bit color value, stored in an integer. A color has an Alpha, Red, Green and Blue component. If red = green = blue then you get a gray. The alpha needs to be 255 so that the color isn't transparent.
The way the ARGB is coded into the integer is quite simple, the 32 bits are split up, and the first 8 bits are for alpha, the next 8 for
red, then green then blue.
So we use some bitwise operations to create the integer:
ARGB
where A = 255, R = gray, G = gray, B = gray:

Say we have Gray = &HAA which is 170 decimal:
Alpha = &HFF
Red = &HAA
Green = &HAA
Blue = &HAA

The integer we want is &HFFAAAAAA
To get the bits into position we can OR the components together:
Alpha FF000000
Red 00AA0000
Green 0000AA00
Blue 000000AA
----------
FFAAAAAA

So that means we need to calculate the Red and Green values from gray.
Red is AA0000, which is gray shifted left by 16 bits, gray << 16
Green is AA00, whcih is gray shifted left by 8 bits, gray << 8

It is a faster alternative to:
Dim c as color = color.FromARGB(255, gray, gray, gray)
pixelColor(i) = c.ToARGB

I don't really understand the different ways that pixels colors are stored from your description. Are all the images grayscale, or are some color? 10, 12 bits/bytes per pixel is not a standard format. 1,8,16,24,32 bit pixel formats are common.
Reply With Quote
  #12  
Old 11-11-2006, 05:42 PM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

Thanks for the help! That is really cool. The code is working great! Here is what my other code looks like. Basically, the variable bytecount is the first byte of the image I am reading.

dim tracker as integer = 0

for i as integer = bytecount to (imagewidth*imageheight-)
gray = mybuffer(i)
gray += 256*mybuffer(bytecount+1)

select case ImageBitsStored

Case 10
gray /= 4
case 12
gray /= 16
case 16
gray /= 256

pixeldata(tracker) = HFF000000 or (gray << 16) or gray(<<8) or gray
tracker = tracker + 1

end select

bytecount +=2
next

This one reads 2 bytes at a time, because there are 2 bytes stired for each pixel data. I thought I was doing this correct...but here is a 12 bit image I did. It looks pixelated. I must be doing something wrong when there is > 8 bits stored per pixel.

If I did have an image that was in color, would it be created to grayscale automatically with my code? Just let me know if I am burning you out with questions. Thanks, Ian
Attached Images
File Type: bmp dipro.bmp (809.3 KB, 8 views)

Last edited by bonedoc; 11-12-2006 at 04:28 PM.
Reply With Quote
  #13  
Old 11-13-2006, 06:09 AM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

Ah, a plain chest x-ray.

If the data is coming from some weird machine then it would explain the odd pixel formats I suppose. C coders tend to squish as much data into a stream as possible, so if the machine is taking pictures with a 12 bit resolution, then they might be sent into the stream every 12 bits. This will be pretty difficult to read, as the 12 bits will be across 1.5 bytes. Urgh. 10 bits will be equally awful. If you are lucky, then they will have padded the data so that the 10 or 12 bits of data are sent into the stream every two bytes...

You will need seperate subs to deal with each ImageBitsStored. So do the select case thing and call Decode8bpp, Decode10bpp, Decode12bpp, Decode16bpp and work on those one at a time.

If you want to keep all the information, then you will be creating images with different formats. The way we are doing it at the moment can only cope with 256 levels of gray. Each of the 10,12,16 bpp can store more levels of gray. If you do it in a lossy fashion first then you'll understand the layout of the data coming in, it is a bit simpler.

Last edited by jo0ls; 11-13-2006 at 08:05 AM.
Reply With Quote
  #14  
Old 11-13-2006, 06:44 AM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

So for Decode16bpp it should look something like this, which is similar to what you had already.

Code:
' ' We want to step through each pixel. ' So we use step 2. For i As Integer = 0 To numberOfBytes - 1 Step 2 ' The gray is a short, and has two bytes. ' We could bitshift the second byte and or with the first ' But lets try the bitconverter... Dim gray As UShort = BitConverter.ToUInt16(myBuffer, i) ' now we can do the division like you had... gray = gray \ 256 ' integer division, we don't want fractions. ' We'll stick to the color class for simplicity lol... ' So we create a color from the seperate ARGB, and then get the ' integer ARGB from that. i\2 should work instead of using tracker.. pixelData(i \ 2) = (Color.FromArgb(255, gray, gray, gray)).ToArgb Next

If it works, and if the 10 and 12 bpp images are padded, then it should work for those too, if you alter the "gray = gray \ 256" step.

For 10 bpp the max value is binary:
11 1111 1111 = 1023, so to fit the values into a byte you divide by 4.

For 12 bpp the max value is binary:
1111 1111 1111 = 4095, so to fit the values into a byte you divide by 16.

So that is what you already have, I guess the data is padded too. For the best quality images then you need to look at what image formats can store 16 bits of grayscale, and figure out which .Net pixelformat it corresponds to.

edit: System.Drawing.Imaging.PixelFormat.Format16bppGrayScale aha...
edit edit:

Quote:
It was decided not to support 16 bit images due to other technical problems but the code got left in the framework by mistake.
Really the public should never have seen it.
Try using FreeImage for this sort of thing.
--
Bob Powell [MVP]
So I guess it (i.e. creating the higher quality image) can't be done with the framwork. (I was getting weird results playing with 16bpp...)

Last edited by jo0ls; 11-13-2006 at 08:07 AM.
Reply With Quote
  #15  
Old 11-13-2006, 08:42 AM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

Thanks, that makes sense. Are you saying that .NET 2005 cannot handle the images like that? When I was looking around, I could not find anything about medical images in .NET. It was all in C# or ++. What do you think I should do? Should I just create it in those languages? I wish there were a way to do it in 2005. Thanks.
Reply With Quote
  #16  
Old 11-13-2006, 10:05 AM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

Windows desktop color depth is at best 32bpp. So you won't be able to display the 16bpp grayscale anyway, as the 32bpp color depth only has grays where R=G=B, and so it has 8bpp grayscale capability....

But, for medical imaging, I'm guessing you want to save the stream at the maximum color depth to preserve all the information. Ideally your program would be able to display the images as 8bpp, and also save them at 16bpp to preserve all the data.

To display them then, you can carry on what we were doing. Use a lossy conversion from 16 bits to 8 bits. To save them you would need to look into the FreeImage library, or something similar. The FreeImage library has a C# wrapper, so it should be possible from vb.net too.

Here's a similar thread: http://www.codeguru.com/forum/showth...53#post1326553

He gives too ways to do the lossy conversion:
just read the high byte - This is sort of what we were doing, but we have the additional complication of 10 and 12 bit depths.
remap - map the lowest value gray from the 16bit values to 0 in the 8bit values, and the highest value gray from the 16bit values to 255 in the 8bit values. This makes full use of the 256 grays available. You could do this.
Reply With Quote
  #17  
Old 11-13-2006, 11:40 AM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

Code:
' ' We want to step through each pixel. ' So we use step 2. For i As Integer = 0 To numberOfBytes - 1 Step 2 ' The gray is a short, and has two bytes. ' We could bitshift the second byte and or with the first ' But lets try the bitconverter... Dim gray As UShort = BitConverter.ToUInt16(myBuffer, i) ' now we can do the division like you had... gray = gray \ 256 ' integer division, we don't want fractions. ' We'll stick to the color class for simplicity lol... ' So we create a color from the seperate ARGB, and then get the ' integer ARGB from that. i\2 should work instead of using tracker.. pixelData(i \ 2) = (Color.FromArgb(255, gray, gray, gray)).ToArgb Next

Ah..that makes sense. Actually, this is good, because I dont need to do any writting, just displaying in a picturebox. So, should the code above work for 10,12,16, and 32 bit images? You really know what you are you doing. Are you a programmer by trade?
Reply With Quote
  #18  
Old 11-13-2006, 12:12 PM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

Nope, but thinking about it. It's hard to get your foot in the door though...

I had a play with it, here's an example that shows how the remapping works. It clears up pictures with low contrast nicely. Again I'm just using random data instead of real images. To pretend an image has low contrast, I restrict the range of "pixel colors" in the random image.
Attached Files
File Type: zip bppConverter.zip (17.3 KB, 9 views)
Reply With Quote
  #19  
Old 11-13-2006, 03:46 PM
bonedoc bonedoc is offline
Junior Contributor
 
Join Date: Mar 2006
Posts: 376
Default

Man! You rock! I really appreciate that! everything is opening great! The only problem I have seen is with this 16-bit image. It is not really gray...just strict black an white. Do you know what could cause such a thing? Surely, it is not suppost to be in color. It is a CT scan.
Attached Images
File Type: bmp untitled.bmp (613.1 KB, 10 views)
Reply With Quote
  #20  
Old 11-13-2006, 08:31 PM
jo0lsA faster way that .SetPixel to draw a bitmap? jo0ls is offline
Senior Contributor

Forum Leader
* Expert *
 
Join Date: Feb 2005
Location: London
Posts: 1,050
Default

It's not supposed to be colored, but it needs to be a negtive of what you have though. (you can use gray = 255 - gray to invert the gray byte).

If you open it in irfanview and look at the properties then you see that it has all 255 colors (grays).
If you use vb.net to scan it, then it concurs, they are all there. I wrote a program to scan the image and highlight all the colors that appear in fewer that 100 pixels, for some reason these pixels appear in a regular pattern.

Maybe the two bytes need their orders reversed, i.e. a big-endian verses little-endian system. Could be a duff image. Are there other 16bit images that do work? If so I'd not worry about it.
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off

Forum Jump

Advertisement:





Free Publications
The ASP.NET 2.0 Anthology
101 Essential Tips, Tricks & Hacks - Free 156 Page Preview. Learn the most practical features and best approaches for ASP.NET.
subscribe
Programmers Heaven C# School Book -Free 338 Page eBook
The Programmers Heaven C# School book covers the .NET framework and the C# language.
subscribe
Build Your Own ASP.NET 3.5 Web Site Using C# & VB, 3rd Edition - Free 219 Page Preview!
This comprehensive step-by-step guide will help get your database-driven ASP.NET web site up and running in no time..
subscribe
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap? A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
 
A faster way that .SetPixel to draw a bitmap?
A faster way that .SetPixel to draw a bitmap?
 
-->