Как я могу сохранить/загрузить 16 растровых изображений в .net x64?

Прежде, когда я использовал win32, я использовал FreeImage, чтобы загрузить и сохранить битовые массивы битовой глубины, больше, чем 8 битов. Это - каждое изображение, с которым я работаю, так как я делаю медицинскую обработку изображений, и прежде чем любой скажет что-либо, да, меня, и мои клиенты потратили много денег на высокой яркости, высококонтрастных мониторах с 11 или 12 битами динамического диапазона. На самом деле, если Вам любопытно, требования ACR для рабочей маммографии включают монитор по крайней мере с 10 битами динамического диапазона.

Я просто переключился на x64 для издержек памяти и получить всю мою разработку на одну платформу и режим компиляции. Я быть бы для поддержки к win32, и мои клиенты тут же со мной (и действительно принуждение изменения). FreeImage не компилирует на окнах на 64 бита; это имеет _asm директиву в коде, чтобы компилятор просто не мог обработать.

Я думал, что попробую собственную поддержку.NET в классах Microsoft. Длинная короткая история: Они не работают и перестали работать с очень ограниченными сообщениями об ошибках. Я подозреваю, что это - потому что Microsoft все еще не поддерживает класс Format16bppGrayScale.

Возможно, в моем коде существует проблема. Вот мой код для записи:

Bitmap theBitmap = new Bitmap(inImage.XSize, inImage.YSize, PixelFormat.Format16bppGrayScale);

//have to go with lockbits
Rectangle rect = new Rectangle(0, 0, theBitmap.Width, theBitmap.Height);
System.Drawing.Imaging.BitmapData bmpData =
    theBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
    PixelFormat.Format16bppGrayScale);
IntPtr ptr = bmpData.Scan0;
int theByteSize = theBitmap.Width * theBitmap.Height *2;
byte[] theByteBuffer = new byte[theByteSize];
System.Buffer.BlockCopy(inImage.Data, 0, theByteBuffer, 0, theByteSize);
System.Runtime.InteropServices.Marshal.Copy(theByteBuffer, 0, ptr, theByteSize);
theBitmap.UnlockBits(bmpData);

theBitmap.Save(inDirectory + "\\" + inName);
theBitmap.Dispose();

Этот код разрушает программу с

An unhandled exception of type 
 'System.Runtime.InteropServices.ExternalException' occurred in 
 System.Drawing.dll

Additional information: A generic error occurred in GDI+.

Интересный, тем более, что я никогда не хочу нарисовать это изображение на экран как это (хотя это было бы хорошо!), но просто хочу использовать сохранить/загрузить функциональность. Изображение действительно становится записанным в диск (даже при том, что программа отказывает), и следующий код чтения также разрушает программу:

Bitmap theBitmap = new Bitmap(theCompleteName, false);
ushort[] theData = new ushort[theBitmap.Width * theBitmap.Height];
int x, y;

switch (theBitmap.PixelFormat)
{
    case PixelFormat.Format16bppGrayScale:
        //have to go with lockbits
        {           
            Rectangle rect = new Rectangle(0, 0, theBitmap.Width, theBitmap.Height);
            System.Drawing.Imaging.BitmapData bmpData = 
                theBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly,
                PixelFormat.Format16bppGrayScale);
            IntPtr ptr = bmpData.Scan0;//scanline approach left over from FreeImage

            for (y = 0; y < theBitmap.Height; ++y){
                byte[] scanline = new byte[theBitmap.Width*2];
                System.Runtime.InteropServices.Marshal.Copy(ptr, scanline, y * theBitmap.Width * 2, theBitmap.Width * 2);
                System.Buffer.BlockCopy(scanline, 0, theData, y * theBitmap.Width * 2, theBitmap.Width * 2);
            }
            theBitmap.UnlockBits(bmpData);
        }
        break;
    //for colors, just take the red and call it a day


    case PixelFormat.Format24bppRgb:
    case PixelFormat.Format32bppArgb://really stupid reading code, always works
        for (y = 0; y < theBitmap.Height; ++y) {
            for (x = 0; x < theBitmap.Width; ++x) {
                theData[y * theBitmap.Width + x] = (byte)(theBitmap.GetPixel(x, y).R);
            }
        }
        break;
}
theNewImage = new ImageContainer(theData, theBitmap.Width, theBitmap.Height, inName, inAssessmentID);
theBitmap.Dispose();//not needed, anymore

Этот код разрушает программу с ошибкой:

An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll

Additional information: Parameter is not valid.

Эти результаты говорят мне, что Microsoft все еще не зафиксировала часть Format16bppGrayScale перечисления PixelFormat. Это - позор.

Таким образом, что я могу использовать, чтобы загрузить и сохранить полутоновые образы на 16 битов на x64 с.NET?

(РЕДАКТИРОВАНИЕ: Я должен добавить, что, в то время как я могу сохранить образы DICOM, я должен выполнить эксперименты на нетерпеливых данных, чтобы проверить, что алгоритмы являются звуковыми и т.д. DICOM требует ряда UIDs и других обязательных полей, которые являются излишеством для того, в чем я нуждаюсь; мне просто нужны изображения и не терпеливые данные, в данный момент).

5
задан luvieere 27 August 2011 в 13:29
поделиться

1 ответ

Я не совсем отвечаю на ваш вопрос, но ранее я использовал компонент ImageDraw, продаваемый Neodnyamic, и определенно рекомендовал бы (и использовал) его снова. Он не бесплатный, но вполне стоит небольших инвестиций.

0
ответ дан 15 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: