|
Seeing the questions you have posted here in the last days, I think you have the bad habit of using ToString() method for everything, no matter if it is indeed a string, or a number, or a color, or whatever. If you want an array of colors, why do you declare a string[] array? Which is the type of the items you have in your ListBox ? The string you are showing us ( Color[A=255, R= 255, G= 0, B= 0] ) is exactly what an object of Color type returns when you invoke its ToString() method so, how did you add the colors to the ListBox? Did you add the Color objects or did you also invoke ToString method to add them? I mean, if "c" object is a Color object, did you do this:
ListBox.Items.Add(c);
Or did yo do this:
ListBox.Items.Add(c.ToString());
I am asking becouse in both cases you would see the same result in the ListBox. However, in the first case the items are Color objects, so you only have to cast them to Color type:
Color[] colors = listBox10.Items.Cast<Color>().ToArray();
But in the second case the problem is harder becouse you should parse each string. Summarizing, as a piece of advise, use ToString method only when you need a string object.
|
|
|
|
|
when i use
listBox10.Items.Add(d);
the listbox do not display their color values but just "(Collection)"
my code as shown below"
Dictionary<Color, int> d = new Dictionary<Color, int>();
Color c;
Bitmap checkColor = new Bitmap(pictureBox2.Image);
for (int i = 0; i < checkColor.Width; i++)
{
for (int j = 0; j < checkColor.Height; j++)
{
c = checkColor.GetPixel(i, j);
if (d.ContainsKey(c))
d[c]++;
else
d.Add(c, 1);
}
listBox10.Items.Add(d);
}
I wanted to find the main colors of an image. so i use count colors however unsure of how it shld go abt doing it. any idea?
modified on Wednesday, November 24, 2010 10:31 PM
|
|
|
|
|
You see "(Collection)" in the listBox becouse there is a little mistake in your program. See this:
Dictionary<Color, int> d = new Dictionary<Color, int>();
listBox10.Items.Add(d);
You are adding the Dictionary object to the listBox, not the Color objects. Remove that line and put this one at the end:
listBox10.Items.AddRange(d.Keys);
However, I don't know how adding the colors to a ListBox could help you. What you want to do is color quantization and, belive me, it is not a trivial task. You need to write an algorithm for clustering the colors. You might consider every color as a point in a three dimensional space, so any three dimensional clustering algorithm would help you for what you need. Once you have the colors clustered, you should only average each cluster and make the replace.
modified on Thursday, November 25, 2010 11:12 AM
|
|
|
|
|
What is the best class(es) to use to get the properties of the system your app is running on.
For example:
Total RAM
Video Card
Detailed CPU info
etc.
I have tried some articles but the classes they suggest are either obsolete or incomplete.
Thanks.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
|
Thanks. I did use this. It has some info but is limited on the hardware details.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
I use a mix of System.Environment, WMI classes (System.Management), Win32 functions (through P/Invoke), some registry accesses, and some assembly code, and still I'm not getting all I would like to collect.
FWIW: MS guidelines will tell you your app shouldn't be interested nor care. However I understand knowing the characteristics of a platform and logging them can be very relevant in debugging an app with multiple and various customers.
|
|
|
|
|
Thanks. Can you provide a little more detail please. Class names, ...
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
I'm not going to copy dozens of class names, methods, dlls, function names.
If you have a very specific requirement, I'll see what I can provide.
And it wouldn't hurt if you explained a bit why you need those things, the best way may depend on it, as accuracy, performance and prerequisites may vary.
|
|
|
|
|
Sorry. I did not realize that would be necessary. Thanks for the guidance. I'll try to take it from here.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
Luc Pattyn wrote: knowing the characteristics of a platform and logging them can be very relevant in debugging an app with multiple and various customers
That's terribly true!
|
|
|
|
|
Precisely. That is one reason I would like to have the techniques in place. I do use an exception capture form and logging system that encourages user input and email responses from the form.
Having a good relevant H/W and S/W profile is very useful. Many users cannot answer/or will not answer questions about there configurations.
I am making some progress on getting more details. I am not happy with it yet. Any ideas on Classes to use and Code snippets are welcome.
Thanks.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
|
|
Thanks. These all look useful.
The first reference is one I found before. I have not figured out how to create the code to use it yet. Any tips?
The WMI tool will save lots of time as I get in deeper. Pinvoke looks super, but will take some ramp-up to get the value from it.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
|
Thanks for the reply.
It looks like the following is the key, as you suggest:
using System;
using System.Management;
ManagementClass c = new ManagementClass(
new ManagementPath("Win32_LogicalDisk"));
PropertyDataCollection properties =
c.Properties;
...
I can see the WMI code creator is a strong helper as well.
The Help System has an extensive list for "Computer System Hardware Classes" to use with WMI.
This looks like it may have the detail I am looking for.
There are a number of C# classes like DriveInfo, NetworkInterface, ... that may be better choices once you discover them. The WMI is organized so that it may be easier to use.
Poking around on this topic has lead me to more useful namespaces and classes, at least.
Thanks to all for the guidance.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
Just be aware that some of the data isn't supported on some OS versions. Along with that some things like the WMI Installer Providers are not installed by default on operating systems such as Server 2003.. so you would get a "Invalid Class" error if you run into that problem.
|
|
|
|
|
Thanks for the clarification. I downloaded the WMI Provider to review this.
Using the WMI code generator and adapting the code for a Forms app with a little extra logic and code here and there is going well. They use the ManagementObjectSearcher. My reading recommends this as a preferred approach.
I am proceeding well on this now.
"Coding for fun and profit ... mostly fun"
|
|
|
|
|
Use WMI[^].
The funniest thing about this particular signature is that by the time you realise it doesn't say anything it's too late to stop reading it.
My latest tip/trick
Visit the Hindi forum here.
|
|
|
|
|
Hi All,
At the moment I'm converting the body of word and other documents to type Byte array using the following:
Byte[] b = Convert.FromBase64String(attach.Body);
This works fine for most word documents apart from those that have a body formatted using html tags. The result is that an exception is thrown "System.FormatException: Invalid character in a Base-64 string."
Does anyone know how I can convert the html formatted word document into a Byte array?
Thank you,
Mel
|
|
|
|
|
That is completely wrong. Do you have any idea what Base64 is? it only accepts 64 different characters and is intended for encoding binary data into text, making it ready for easy transmission or storage. You can't feed arbitrary text to Convert.FromBase64String and get away with it.
What you need depends on the context, which you didn't make clear. It may be simply reading an existing file as binary data (using File.Read or ReadAllBytes); or writing existing data to a MemoryStream, then calling MemoryStream.ToArray().
|
|
|
|
|
In that case maybe I assume you're saying I'm using the Base64 in the wrong way.
The only reason I'm using it is to convert the body of an attachment into a Byte array and then pass that byte array to a memory steam, which is then written to a FileStream.
Byte[] b = Convert.FromBase64String(attach.Body);
System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);
FileStream fsFile = File.OpenWrite(strTarPath + "\\" + strFName);
mem.WriteTo(fsFile);
MemoryStream takes in a Byte array and this is the reason for the convertion.
I looked for MemoryStream.ToArray() but it doesn't seem to exist.
Any ideas?
Thanks,
Mel
|
|
|
|
|
MWRivera wrote: I'm using the Base64 in the wrong way
No. You are not using it in the wrong way. It is wrong for you to use base64 at all.
Now explain what you need or want in functional terms, then people might be able to help you.
I will not provide any code, not even a class name, as long as you don't explain your goals.
|
|
|
|
|
Functional Terms
The code should take email attachments and save them to a directory, renaming the files in the process.
If anyone can provide help with this, I would really appreciate it.
Thank you,
Mel
|
|
|
|