|
You're right, I wan't paying attention there. Updated code looks like this:
void worker_DoWork(object sender, DoWorkEventArgs e)
{
int width = (int)Math.Round(Width * fDPIX);
int height = LogHeightPixels;
Bitmap bmpNew = new Bitmap(width, height/*, System.Drawing.Imaging.PixelFormat.Gdi/*.Format32bppArgb*/);
DrawLogToBitmap(bmpNew);
e.Result = bmpNew;
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Bitmap bmpNew = (Bitmap)e.Result;
if (bmp != null)
{
bmp.Dispose();
bmp = null;
}
bmp = bmpNew;
Refresh();
}
Refresh ends up calling my Draw method here:
public override void Draw(Graphics gfx, Rectangle rect)
{
gfx.ScaleTransform(zoom, zoom);
// Update the bitmap (only as needed)
if (bDirty)
{
UpdateBitmap(gfx);
}
if (bmp == null || worker.IsBusy)
{
gfx.DrawString("Updating Bitmap, please wait!", this.Font, Brushes.Black, new PointF(0, 0));
return;
}
RectangleF rcSource = new RectangleF(-horizontalOffset, -verticalOffset, ClientRectangle.Width/zoom, ClientRectangle.Height/zoom);
RectangleF rcDest = new RectangleF(ClientRectangle.Location.X, ClientRectangle.Location.Y, ClientRectangle.Size.Width/zoom, ClientRectangle.Size.Height/zoom);
try
{
gfx.DrawImage(bmp, rcDest, rcSource, GraphicsUnit.Pixel);
}
catch (Exception exc)
{
gfx.DrawString(exc.Message, Font, Brushes.Black, new PointF(0,0));
}
etc....
}
Now, the bitmap seems OK, but I get an out of memory exception when I call DrawImage (hence the try/catch block). Using the exact same drawing code in the main thread causes no problems, even though it's a pretty big bitmap (2496 * 49152 * 32 bpp). If I try using a bitmapp with a different pixel format, say 16bpp to conserve memory, performance becomes terrible, but I don't get the exception.
|
|
|
|
|
I've never done C#....what thread does the worker_RunWorkerCompleted() get executed on?
Thanks,
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
That one runs on the main thread. The handler for the DoWork event runs in the worker thread.
Aaron
|
|
|
|
|
Hmm then with a (close to) 500MB image maybe the thread adds just enough to put memory use
over the top?
When you do this:
Bitmap bmpNew = (Bitmap)e.Result;
That just copies a reference, right? It doesn't make a new duplicate object?
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Since your Draw method makes sure that while the background thread is busy, a draw doesn't happen on the bitmap - you don't need to keep creating a new bitmap. In fact, looking at the size of the bitmap you're creating, I bet a lot of your 5-10 second draw is taken up by simply creating that bitmap object. This is of course making the assumption that your bitmap size isn't constantly changing - if that is the case, then ignore this post - if the bitmap size is (fairly) constant, then keep reading.
class SomeForm : Form
{
private Bitmap _theImage;
private bool _working = false;
void worker_DoWork(object sender, DoWorkEventArgs e)
{
if (_theImage == null)
{
int width = (int)Math.Round(Width * fDPIX);
int height = LogHeightPixels;
_theImage = new Bitmap(width, height);
}
DrawLogToBitmap(_theImage);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_working = false;
Refresh();
}
public override void Draw(Graphics gfx, Rectangle rect)
{
gfx.ScaleTransform(zoom, zoom);
if (bDirty)
{
_working = true;
UpdateBitmap(gfx);
}
if (_working || worker.IsBusy)
{
gfx.DrawString("Updating Bitmap, please wait!", this.Font, Brushes.Black, new PointF(0, 0));
return;
}
RectangleF rcSource = new RectangleF(-horizontalOffset, -verticalOffset, ClientRectangle.Width/zoom, ClientRectangle.Height/zoom);
RectangleF rcDest = new RectangleF(ClientRectangle.Location.X, ClientRectangle.Location.Y, ClientRectangle.Size.Width/zoom, ClientRectangle.Size.Height/zoom);
try
{
gfx.DrawImage(_theImage, rcDest, rcSource, GraphicsUnit.Pixel);
}
catch (Exception exc)
{
gfx.DrawString(exc.Message, Font, Brushes.Black, new PointF(0,0));
}
etc....
}
}
I may have missed something (I've been up for FAR too long, and can't sleep for some reason), but that's the gist of it. You'll probably want to do a few more checks to make sure the bitmap isn't being accessed from multiple threads at the same time. This should get rid of your memory exception, and give a significant performance boost, since the garbage collector won't need to run as often and you're not allocating massive amounts of memory all the time.
Another thing you may want to get rid of is that background worker, and just use a normal thread with a longer lifetime. Spawning a new thread for each request does add a bit of overhead, so in similar situations I typically start up a background thread early in the program, and use an AutoResetEvent or similar to tell it when to wake up and do something.
-----
In the land of the blind, the one eyed man is king.
|
|
|
|
|
hi,
i am working on a project that deals with tiff files. i am using a picture box to display the image from the tiff file, but i can only display the first image. how can i display other images of the same tiff file?
regards
|
|
|
|
|
don't worry, i found the answer.
regards
|
|
|
|
|
Hi
Do You Help Me About Tiff?
I Have A Problem Like You.
Tank You.
Mogtabam
|
|
|
|
|
What problem are you having?
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Hi, I have a managed DX app with a window using orthographic projection. I am handling the DeviceResizing event, setting e.Cancel = true; to call upon default processing of the event. However: when I do this and resize the window, my textures get rescaled to a lower resolution. When I do not do this, the application crashes as soon as I resize the window.
Does anyone know why this is happening?
Thanks for any help!
|
|
|
|
|
I am trying to develop a program to determine the max number of rectnagles in a shape. The user would draw or define any closed shape. Next the height of the rectnagle would be defined. Then the program would calculate each rectnagle that could fit in the shape. Each rectanglke must be the height provided and always try to be as wide as possible.
so if we take a simple example of a circle. The rectnagles in the middle would be the longest, and the rectnagles at the top and bottom would be the shortest. But all the rectnagles would the same hieght.
Any ideas on how to go about doing this would be greatly appreciated
|
|
|
|
|
It sounds like you read a small paper of mine that was based on a piece of code (ellipses/circles/convex shapes) I wrote for doing exactly what you are talking about, but I only gave the paper to one person. Determining the number of rectangles for a circle or ellipse is not difficult [given the algorithm], provided that they consist of overlapping rectangles. Doing it for any shape gets a bit crazy and I have still not figured out that problem. The first thing you have to do (for any shape) is determine the boundaries, which means determining where each point on the edge will be drawn. Given the boundaries you must look for the all the horizontal lines that are adjacent to each other and of the same length, with the same starting and ending X values. It sounds fairly simple but it is way more complicated than that (for what I was trying to do). A good place to look is at algorithms for filling polygons like “Michael Abrash’s Graphics Programming”, He does not cover the subject you are asking about, but he does cover polygon edge scanning (polygon filling).
I am very curious as to what purpose you are applying this too and have kept my answer as general as possible, because I do not know the why.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
Yeah I agree for any shape (closed not open btw, but allow for holes) is a little crazy, but I think it can be done. Really the application will be filling this shape with text, but the text portion is not important to me, what is important is the rectangels that can fit in the shape. Then obvioulsy it is very easy to fill these rectangles with text.
If you have some sample code of your algorithm for convex shapes, I would love to see it.
Was it for all convex shapes or just circles and ellipses?
|
|
|
|
|
I am afraid that I misplaced the original source code; I may have lost it, as I can only find an older version of my library. The code was originally an experiment in clipping lines to an elliptical/circle and I never generalized it for any convex shape, although I had planed too at a latter date. What I did was break the ‘Cohen-Sutherland Line-Clipping Algorithm’ (Computer Graphics Principles and Practice, Foley et al., pp. 113-117) into a series of small inline functions, so I could pick and choose the pieces required; in this case I was only interested in the corners. Given that and a list of the horizontal lines, I was able to clip all drawing done by my old graphics library to the elliptical shape as if it was a clipping rectangle. I suspect that there are faster ways to do it, but I have not thought of, nor seen, another way to do it.
If you overlay a copy of the ‘Cohen-Sutherland region outcodes’ diagram over the shape with the clipping rectangles corners touching the edges, you will see the idea behind what I was doing. Example: draw the diagram and then draw a circle around it so that the edge passes through the four corners of the clipping rectangle and you will see why I only considered the corners.
Good Luck!
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
You might want to check out this article[^]. (Window regions are simply lists of rectangles that cover the desired area)
----
It appears that everybody is under the impression that I approve of the documentation. You probably also blame Ken Burns for supporting slavery.
--Raymond Chen on MSDN
|
|
|
|
|
I'm attempting to write a *RAW* DV stream to a file (for other processing on it later).
In GraphEdit -
* RenderFile some (any) media file
* Delete the video renderer
* Insert DV Video Encoder and connect input pin to (some decoder's) remaining video output pin
* Insert an AVI Mux and connect to DV Video Encoder output pin
* Insert a FileWriter and connect input pin to AVI Mux video output pin
Running this results in a valid AVI file with DV media. OK, But...
This file includes the AVI wrapper header information, and this is my problem. I need ONLY the DV stream data itself, with no AVI header.
The the DV Video Encoder output pin (an XForm Out pin) will not connect directly to FileWriter input pin.
So I must understand how to convert the DV Video Encoder XForm Out stream to a form the FileWriter input pin will accept. I'm guessing I need to make a filter using CTransInPlaceFilter, but I'm not yet sure, or how to do it. Does anyone know of sample code to accomplish this?
Alternately, AVI Mux makes the correct connection, but adds the AVI header. Does anyone know of example source code for the AVI Mux Filter?
Any other suggestions welcome.
Thanks very much
Brooks
Brooks
|
|
|
|
|
The DV Encoder Filter's output pin has the following format:
Major type: MEDIATYPE_Video
Subtype: MEDIASUBTYPE_dvsd
Format type: FORMAT_VideoInfo
The File Writer Filter's input pin supports this format:
Major type: MEDIATYPE_Stream
Subtype: MEDIASUBTYPE_NULL
A transinplace filter won't work since the input and output pins must be the same.
A custom transform filter (CTransformFilter) could work though.
It may be less work to do a custom renderer filter that accepts the DV Encoder Filter's output
format and simply writes the raw DV data to a file. The "Dump" sample filter in the SDK may be a
good starting point.
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Good call. That'll do it. Almost obvious, but hadn't occured to me. Thanks.
Brooks
|
|
|
|
|
This is a repost from the MS GDI newsgroup.
Does anyone know why, in the following code, does the IsVisible() call return true?
Mark
Rect gdiText(507, 636, 6, 7);
Rect rctOne(512, 684, 20, 17);
Rect rctTwo(652, 220, 47, 9);
Region gdiRegion;
gdiRegion.MakeEmpty();
gdiRegion.Union(rctOne);
gdiRegion.Union(rctTwo);
gdiRegion.IsVisible(gdiText);
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
It doesn't, it returns false.
I cut/paste the above into a new project and it was fine.
...cmk
Save the whales - collect the whole set
|
|
|
|
|
I was afraid of that. If you get a chance can you please check your gdiplus.dll version?
It doesn't work properly for me or the OP.
Thanks much!
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
I'm running Win2003 R2 x64.
From VS 2005 i created a new Win32 x86 project and pasted the code in the WM_PAINT case.
My gdiplus.dll's are:
C:\WIN\WinSxS\amd64_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.3790.1830_x-ww_56CDF238\GdiPlus.dll File Version: 5.2.3790.1830 (srv03_sp1_rtm.050324-1447)
and,
C:\WIN\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.3790.1830_x-ww_24C40C58\GdiPlus.dll File Version: 5.2.3790.1830 (srv03_sp1_rtm.050324-1447)
...cmk
Save the whales - collect the whole set
|
|
|
|
|
I was afraid of that too LOL
Mine is XPSP2 gdiplus.dll is 5.1.3102.2180
Where is the mythical GDI+ 1.1 ...
Thank you!
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Hello Gentlemen!
I am working on a project in vb.net. The application will color any grayscaled picture in its actual colors. The problem is big!
All I need is an accurate advise or direction how to setup an algorithm to find the exact colors of the picture.
It seems to me that I have to find the color of each pixel first and then what? Is there any matrix about the colors what reflects a paralelism between graysacaled color set to others.
Any advise would be helpful..
Thank You!
What a curious mind needs to discover knowledge is noting else than a pin-hole.
|
|
|
|
|
I don't think you can get exact colors from a grayscale image.
Have you searched for "colorize algorithm"?
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|