Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
SvetR
17 / 17 / 8
Регистрация: 11.01.2016
Сообщений: 54
1

Tiff to bitmap

13.06.2017, 16:56. Просмотров 232. Ответов 0
Метки нет (Все метки)

Здравствуйте. Никогда не сталкивался с работой с изображениями, и вот уже третьи сутки ломаю голову - немогу найти адекватного решения задачи.

Задача - есть в наличии какой-либо Tiff. Необходимо его уменьшить и преобразовать. Проблема заключается, в том, что тиф может быть большой (например 3х6 метра 100dpi), и он скорее всего будет в cmyk, но может быть в чём угодно включая lab, grayscale, могут быть индексированные цвета, могут присутствовать как альфаканал, так и просто дополнительные каналы, он может содержать слои и т.д.
Далее - что я пытался. Танцев с бубном было море, но фантазия уже кончается.

• Используя GDI - адекватные цвета, работает быстро, при больших размерах получаем ошибку переполнения (System.OverflowException). При поврежденном тифе получаем System.OverflowException, При кривых тегах, получаем System.OverflowException. При наличии доп. слоёв, альфа каналов и прочем - System.OverflowException. При любом чихе - ну вы меня поняли.
Примеры обрезанный, чтоб показать суть:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        public Image TiffToImage(string pathtif)
        {
            Image IM = null;
            try
            {
                using (FileStream stream = File.Open(pathtif, FileMode.Open))
                {
                    using (Bitmap bmp = new Bitmap(stream))
                    {
                        IM = ScaleImage(bmp, 800, 800);
                    }
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return IM;
        }
 
        public Image ScaleImage(Image image, int maxWidth, int maxHeight)
        {
            double ratioX = (double)maxWidth / image.Width;
            double ratioY = (double)maxHeight / image.Height;
            double ratio = Math.Min(ratioX, ratioY);
            int newWidth = (int)(image.Width * ratio);
            int newHeight = (int)(image.Height * ratio);
            var newImage = new Bitmap(image, newWidth, newHeight);
            return newImage;
        }
• Используя LibTiff. Крайне долгая работа. жрёт почти все тифы, чтобы внутрь ни напихали - пофиг на цветовую модель, на слои, доп каналы и т.д. Но 2 проблемы:
Первая - при больших размерах ([количество точек по ширине]*[количество точек по длинне] > [int.max] ) ловим вылет. Но это скорее всего можно обойти - брать кусками, масштабировать, склеивать обратно и прочий геморрой. Правда, есть у меня подозрение, что тогда стандартный билборд 2х3 будет часы конвертироваться.
Вторая, и крайне критичная - крайне неадекватные цвета, если исходник cmyk. Вот эта фигня - ReadRGBAImage - отдаёт в РГБ. И эта самая ргб не имеет никакого отношения к реальным, исходным цветам, как бы я с бубном не плясал вокруг уже полученного rgb изображения. Я умею строить цветовые профиля для самых различных устройств.У меня есть и дорогой спектрофотометр и дорогой софт для этого. Я хорошо умею строить хорошие профиля. Но то, что говно изначально, чтобы я не делал остаётся говном. Проё..тьфуты утерянную и искажённую информацию уже не вернуть. Подозреваю, что это надо искать исходники LibTiff-а, и ковырять их своими кривыми ручёнками. И в сумме всего - на это я пока идти не готов.
Примеры работы: основу брал отсюда - https://bitmiracle.github.io/libtiff.net/ , а мои танцы с бубном думаю никому не интересны.
• Использование PresentationCore (System.Windows.Media.Imaging). Новая для меня штука, как-то не сталкивался до этого. В принципе, объединение недостатков первого и второго пункта. С цветами та же больная байда. Все танцы с ColorContext и ColorConvertedBitmap результаты дают конечно, и даже немного похожие на то что надо, но опять таки не то.

Честно говоря, я в отчаянии и оно мне шепчет браться за толпу спецификаций тифов разных версий и писать свой парсер. Как раз к моим похоронам будет готов. Неужели нет никакой внятной библиотеки для этого? Чтоб не с сомнительными результатми и за 2К баксов, которых у меня нет? Или это просто моё скудоумие прогрессирует с возрастом и я что-то очевидное упускаю? Нужен совет - хотя бы в какую сторону рыть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2017, 16:56
Ответы с готовыми решениями:

Как создать bitmap из области (по координатам пикселей) другого bitmap
Здравствуйте. Подскажите пожалуйста как создать bitmap из области(по...

Считывание космоснимка (.tiff)
Привет всем, прошу помочь со считыванием данных. Не могу найти библиотеку или...

Конвертация из jpeg в tiff
Доброго времени суток. Помогите пожалуйста нужна программа, которая открывает...

Нарисовать прошлый Bitmap на новом так, чтобы небыл растянут рисунок, если новый Bitmap больше размером
Короче пытался сделать такое дело: Рисую фигуры на форме, когда отпускаю левую...

Конвертирование Jpeg в TIFF
Уважаемые программисты! Передо мной поставлена задача преобразования...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2017, 16:56

Робота с Tiff файлами. Visual C#.
Програмка должна открывать файл tiff формата и отображать его на форме. + надо...

Утечка памяти при работе с файлами TIFF
Здравствуйте! Помогите найти утечку памяти, читал msdn, но так и не понял как...

Bitmap в Bitmap
Привет! Как мне в один битмап записать другой, по координатам?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru