Чтение TIFF Изображение из Oracle долго сырье с помощью C # не работает

2

У меня длинный необработанный столбец содержит tiff-изображение, которое сохраняется приложением формы oracle, я пытаюсь получить изображение с помощью С# и сохранить его без везения, изображение действительно, но оно отображает crappy drawing.

Определение столбца DataBase

SIGNATURE     NOT NULL LONG RAW()  

Код С#

internal void save (строковая учетная запись) {var commonAccount = new List();

        using (OracleConnection cn = new OracleConnection(ConfigurationManager.ConnectionStrings["-----"].ConnectionString))
        {
            var imgCmd = new OracleCommand("select SIGNATURE, number, code, name  from table_name where number = ***** and code = *****", cn);
            imgCmd.InitialLONGFetchSize = -1;
            cn.Open();

            var reader = imgCmd.ExecuteReader();
            if (reader.Read())
            {
                //var v1 = reader[0];
                var v2 = reader[1].ToString();
                var v3 = reader[2].ToString();
                var v4 = reader[3].ToString();

                OracleBinary imgBinary = reader.GetOracleBinary(0);

                // Get the bytes from the binary obj
                byte[] imgBytes = imgBinary.IsNull ? null : imgBinary.Value;

                var newData = Convert.ToBase64String(imgBytes);


                MemoryStream stream = new MemoryStream();
                stream.Write(imgBytes, 0, imgBytes.Length);
                Bitmap bm = new Bitmap(stream);
                bm.Save("d:\\image.tif", System.Drawing.Imaging.ImageFormat.Tiff);
            }

            reader.Close();
        }

Сохраненное изображение выглядит как Изображение 174551

Я построил новую форму оракула и связал изображение с колонкой, и он отображался правильно, любая идея? Изображение 174551

EDIT: Я обнаружил, что образ в базе данных Oracle сохранен как порядок байтов Big-Endian

  • 0
    Я не мог воспроизвести эту ошибку. Вот что я сделал: 1) создал таблицу с одним полем; 2) вставлена одна строка с данными изображения; 2) создал эту программу на основе вашего кода. Код работал отлично, правильное изображение было сохранено в D:\image.tiff . Что я делаю неправильно? Можете ли вы помочь мне воспроизвести вашу проблему?
  • 0
    Ваш пример состоит из двух частей: 1) доступ к базе данных; 2) манипулирование байтовым массивом. Возможно, вы сможете определить, какой из них проблемный. Для этого вам нужно сравнить содержимое imgBytes с фактическими байтами в базе данных. Если значения байтов не совпадают, вы сможете удалить манипуляции с растровым изображением и сосредоточиться на доступе к базе данных ( MCVE поможет.)
Показать ещё 11 комментариев
Теги:
oracleforms

1 ответ

1

После нескольких дней понимания и поиска решений, решение проблемы было решено ниже: приведенный ниже код конвертирует в другой тип кодирования изображения, также преобразует его в little-endian

Обратите внимание: код использует библиотеку BitMiracle.LibTiff,

        private string GetBase64Data(byte [] image)
    {
        var data = string.Empty;
        using (MemoryStream ms = new MemoryStream(image))
        {
            using (Tiff tif = Tiff.ClientOpen("in-memory", "r", ms, new TiffStream()))
            {
                // Find the width and height of the image
                FieldValue[] value = tif.GetField(TiffTag.IMAGEWIDTH);
                int width = value[0].ToInt();

                value = tif.GetField(TiffTag.IMAGELENGTH);
                int height = value[0].ToInt();

                // Read the image into the memory buffer
                int[] raster = new int[height * width];
                if (!tif.ReadRGBAImage(width, height, raster))
                {
                    return data;
                }

                using (Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb))
                {
                    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

                    BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                    byte[] bits = new byte[bmpdata.Stride * bmpdata.Height];

                    for (int y = 0; y < bmp.Height; y++)
                    {
                        int rasterOffset = y * bmp.Width;
                        int bitsOffset = (bmp.Height - y - 1) * bmpdata.Stride;

                        for (int x = 0; x < bmp.Width; x++)
                        {
                            int rgba = raster[rasterOffset++];
                            bits[bitsOffset++] = (byte)((rgba >> 16) & 0xff);
                            bits[bitsOffset++] = (byte)((rgba >> 8) & 0xff);
                            bits[bitsOffset++] = (byte)(rgba & 0xff);
                        }
                    }

                    System.Runtime.InteropServices.Marshal.Copy(bits, 0, bmpdata.Scan0, bits.Length);
                    bmp.UnlockBits(bmpdata);

                    MemoryStream ims = new MemoryStream();
                    bmp.Save(ims, ImageFormat.Bmp);
                    data = Convert.ToBase64String(ims.ToArray());
                }
            }
        }

        return data;
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню