|
Hopefully this forum is appropriate for this question. No one seems to visit the graphics forum very often.
I need to be able to both import and export a 16 bit grayscale png file. I have found some help with importing but exporting is a big problem. I have found stack overflow references to Magick.NET but I cannot get this source to compile in VS 2012 as it requires build tools 141 and setting it to 110 results in errors, one of which is a missing dll that I cannot find using internet resources. I have already tried installing runtimes for later versions and for some reason they cannot be used. Probably because I use Windows 7.
Are there any other alternatives? Or advice on how to get a runtime of Magick.NET? I need to be able to read, manipulate (on an individual basis), and save 16 bit grayscale pixel values to a heightmap for importing into various terrain editors.
In terms of manipulating, I can probably use the native 48 bit rgb pixel format (please correct me if I am wrong) for display, convert, and then just read/write to the image directly but I still need to find a runtime that supports reading and writing to the 16 bit format. It would be nice however, if there was a library that did this automatically.
|
|
|
|
|
Try the GIMP API:
gimpconvert
gimpconvert — Conversions between RGB, indexed, and grayscale modes.
gimpconvert
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Thanks for your quick reply. That looks like a native library. Not necessarily a problem but I am curious if there is a .NET wrapper. Also, is that a dll separate from the software or will I need to run GIMP? Is there any documentation on the class formats and uses? I am noticing things like "image_id" and other proprietary data types. One problem I may run into is that I currently need a 64 bit library as my project requires enough memory to produce extremely large bitmaps for illustrating data (I need around 2,061,341,604 bytes available for a 22701 x 22701 image in addition to the regular memory used by the application which is not small by itself).
|
|
|
|
|
I've used the app; not the API.
One way to "automate" GIMP is "scripting".
I think there's also a wrapper out there.
You have options ... and research.
One interfaces with native DLL's when one needs to. OLE. Type libraries. etc.
POV-Ray would be my next look ... more scripting.
Paint.NET ?
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
If you save a bitmap with a png extension, you get a png file. Grayscaling will be described as a tip/trick or article.
--edit
..and you can load a png file into a bitmap. Give it a try
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Yes... been doing what you describe for years. However GDI+ does not import 16 bit greyscale as a 16 bit grayscale and does not export 16 bit grayscale. When it imports, it imports as a 32bit bgra which makes dealing with 16 bit grayscale values impossible because of the loss of information when converting 16 bit grayscale values to 8 bit rgb values. Exporting through the standard .NET drawing libraries is impossible as I have already read in several posts on this topic. My application needs to use grayscale values from 0-65535 in order to avoid a "shelved" appearance in the heightmaps I generate.
|
|
|
|
|
"ARGB" would be four bytes, RGB three. 65635 should fit easily into a 32bit value, without loss.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Hmm... well it appears that either you don't understand colorspaces and how color values work, or you didn't realize that I am trying to display the picture while working on it (which to me is a given). Doing what you suggest will not produce a grayscale picture as assigning a pixel in ARGB format the value of 65535 will give the G (green) channel a value of 255 and a blue channel value of 255 (making yellow) and an ARGB pixel value of 255 will give solid blue.
Furthermore, when .NET reads a 16bit grayscale picture, it DOES use the ARGB (specifically the 32bbpARGB) format and it DOES loose the data because it truncates the 16 bit value to an 8 bit value, losing the less significant bits (so 65535 is read as 255 and 255 is read as zero). You can find documentation about this issue all over the internet. It has the same effect as dividing the 16 bit values by 256. It then fills each of the color channels (RGB) with this 8 bit value so that they are all the same, giving a grayscale picture. Otherwise, you would not see a grayscale picture. If you then try to save the file, it will result in an 8bit grayscale picture. If you try using the 16bbpGrayscale pixel format and then try to save it, .NET throws an exception because 16 bit grayscale picture loading and saving are not supported by .NET (hence the need for this thread).
modified 23-Feb-18 16:53pm.
|
|
|
|
|
primem0ver wrote: Hmm... well it appears that either you don't understand colorspaces and how color values work, or you didn't realize that I am trying to display the picture while working on it (which to me is a given). Not much experience with manipulating the colormap, just curious
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
If GDI+ doesn't support the format, then there's nothing you can do with the System.Drawing assembly.
There are other libraries available, which might support the format. For example:
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks. I hadn't heard of SkiaSharp. I will look into them. I mentioned my problem with Magick.NET in the OP but it turns out that the link for the runtime is just hard to find. Apparently I don't have to compile Magick.NET myself (which I was unable to do because their format is for VS 2017... they don't have any downloads for earlier versions of VS).
As is, I have a working solution since I found the Magick.NET dll and while inefficient, I have a work-around. To clarify, I will probably still look into SkiaSharp for this, or future reference, as Magick.NET doesn't appear to have an efficient way of modifying pixel values directly.
|
|
|
|
|
|
I created a numeric up down control that can be placed in a toolstrip using the ToolStripControlHost. Now I want to be able to use it in designer. This article explains why it can't be done strictly using the ToolStripControlHost but it doesn't explain how to make it Designer compatible... at least not explicitly.
The problem is that I am already inheriting from ToolStripControlHost. As far as I know, c# does not allow inheriting from more than one class. So how do I make my ToolStripControlHost control Designer compatible? I have researched and found that there is a DocumentDesigner class that I could subclass and reference. However, I don't want this control to be added to the Toolbox. I only want it to show up on the ToolstripItem designer interface, so I am allowed to add it as shown in the example in the linked article (The "Month Calendar" in the dropdown for adding another control to the toolstrip). How would I do this?
|
|
|
|
|
Hi,
I have created a process that's runing a thread that open some windows form, now i want that other
running threads from the same process will be able to pass data to this windows form or even close it or reopen it.
The Windows form GUI is always in use of the end users so i cant lock.
what is the best way to implement it in c# ? i would like a short example, thanks.
|
|
|
|
|
|
Hello everybody,
I need to get the list of all the processes running in a Windows Embedded Compact 7 operating system.
My application is written in C# (Visual Studio 2008).
The problem is that the function System.Diagnostics.Process.GetProcesses() is not present in .NET Compact Framework and I don't know how to get the processes list.
Someone has some ideas on how to solve the problem?
Thank you in advance.
|
|
|
|
|
|
Thanks Eddy!
That's what I needed!
Unfortunately I had not found that article...
|
|
|
|
|
I am starting to work on a polygon library, whose side are bezier curves. The basic don't quite work yet so I can't really write stress / performance test program yet. nor show much code.
At any rate I have classes like that
public class BezierFragment
{
Point2D[] controlPoints;
}
public struct Point2D { public double X, Y; }
But I am wondering whether I should instead use struct (for less heap allocation and more stack copies)
public struct BezierFragment
{
byte order;
Point2D p0, p1, p2, p3;
}
public struct Point2D { public double X, Y; }
The later is much easier on the memory management, but might require more copy (of 65 bytes) struct. I wonder which one would be best.
How would I figure out the best option?
The (possible) memory management issues of the first choice might only be apparent when lots of Point2D[] array are saved in generation 2 memory pool and then destroyed...
Any tip?
modified 13-Feb-18 20:37pm.
|
|
|
|
|
Found that:
Choosing Between Class and Struct | Microsoft Docs
it says (one criteria for struct)
It has an instance size under 16 bytes.
if I use float for X, Y in Point2D, should be 33 bytes overall.... (or 36? with struct padding) might be too big...
|
|
|
|
|
This should only be a problem if you're using decimal.
A float pair should only be 8 bytes (plus anything else you have in the struct). You should even be able to scale up to a double pair and ride that limit line.
"There are three kinds of lies: lies, damned lies and statistics."
- Benjamin Disraeli
|
|
|
|
|
I think the concern was the second version of BezierFragment , which has a byte plus four double pairs, all of which would be inline.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Ugh, more coffee.
"There are three kinds of lies: lies, damned lies and statistics."
- Benjamin Disraeli
|
|
|
|
|
How to add columns dynamically to wpf datagrid in MVVM without using dependency properties
|
|
|
|
|