gifts2017

Поворот картинки

Опубликовал Борис Котляр (bborisko) в раздел Программирование - Практика программирования

Иногда возникает необходимость повернуть картинку из 1С.

К сожалению 1С не умеет поворачивать изображения. Мне уже несколько раз подобныен задачи приходилась решать. Приходиться выкручиваться, используя внешние компоненты или предустановленные программы. Это бывает не всегда удобно, так как требует предварительной установки.

Хочу предложить свой вариант решения - была написана небольшая консольная утилитка, которая вызывается из 1с и осуществляет поворот.

Параметры вызова:

               исходный файл, /u:угол,/fs:конечный файл 

               Версия 0.35:

               Добавил: [/q:] - Качество сохранения для Jpeg (от 1 до 10) по умолчанию 7

                               [/c:] - bw - перевести картинку в чб, gs - в оттенки серого (gs2 - другой пресет перевода)

                      Обновил обработку - теперь она демонстрирует и вариант работы с цветом.

Если не задан конечный файл, то измененная картинка будет записанна в исходный, угол по умолчанию 90.

Если конечный файл задать другого формата - то будет произведена конвертация.

Работает с форматами bmp,jpg,png,tiff. Конвертация в tiff не поддерживается.

 

В файле программа и демо - обработка. Будьте внимательны - обработка сохраняет трансформированное изображение в исходный файл.

 

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
miniRotate
.zip 821,22Kb
21.12.13
25
.zip 821,22Kb 25 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

2. Борис Котляр (bborisko) 16.12.13 15:26
Вот только размер у imagemagick большой.
3. Сергѣй Батанов (baton_pk) 16.12.13 15:45
(2) bborisko, не поспоришь.
Но для установки на сервер для обработки картинок на сервере - самое то.
4. Ийон Тихий (cool.vlad4) 16.12.13 15:54
(2) bborisko, но зато он проверен временем и открытостью кода. к тому же там com сервер есть, что позволяет его и на сервере приложений использовать.
gaglo; baton_pk; +2 Ответить
5. Ийон Тихий (cool.vlad4) 16.12.13 16:04
вот кстати, что было бы несколько интереснее, это "интеллектуальный" поворот. когда осуществляется поворот скана в правильное для чтения положение.
6. Александр Шкураев (salexdv) 16.12.13 16:46
7. Ийон Тихий (cool.vlad4) 16.12.13 16:55
(6) salexdv, кстати до кучи можно добавить туда метод создания прозрачной картинки. вот нарыл откуда-то, с тех пор использую
 /// <summary>  
        /// Returns a transparent background GIF image from the specified Bitmap.  
        /// </summary>  
        /// <param name="bitmap">The Bitmap to make transparent.</param>  
        /// <param name="color">The Color to make transparent.</param>  
        /// <returns>New Bitmap containing a transparent background gif.</returns>  
        public static Bitmap MakeTransparentGif(Bitmap bitmap, Color color)
        {
            byte R = color.R;
            byte G = color.G;
            byte B = color.B;
            MemoryStream fin = new MemoryStream();
            bitmap.Save(fin, System.Drawing.Imaging.ImageFormat.Gif);
            MemoryStream fout = new MemoryStream((int)fin.Length);
            int count = 0;
            byte[] buf = new byte[256];
            byte transparentIdx = 0;
            fin.Seek(0, SeekOrigin.Begin);
            //header  
            count = fin.Read(buf, 0, 13);
            if ((buf[0] != 71) || (buf[1] != 73) || (buf[2] != 70))
                return null; //GIF  
            fout.Write(buf, 0, 13);
            int i = 0;
            if ((buf[10] & 0x80) > 0)
            {
                i = 1 << ((buf[10] & 7) + 1) == 256 ? 256 : 0;
            }
            for (; i != 0; i--)
            {
                fin.Read(buf, 0, 3);
                if ((buf[0] == R) && (buf[1] == G) && (buf[2] == B))
                {
                    transparentIdx = (byte)(256 - i);
                }
                fout.Write(buf, 0, 3);
            }
            bool gcePresent = false;
            while (true)
            {
                fin.Read(buf, 0, 1);
                fout.Write(buf, 0, 1);
                if (buf[0] != 0x21)
                    break;
                fin.Read(buf, 0, 1);
                fout.Write(buf, 0, 1);
                gcePresent = (buf[0] == 0xf9);
                while (true)
                {
                    fin.Read(buf, 0, 1);
                    fout.Write(buf, 0, 1);
                    if (buf[0] == 0)
                        break;
                    count = buf[0];
                    if (fin.Read(buf, 0, count) != count)
                        return null;
                    if (gcePresent)
                    {
                        if (count == 4)
                        {
                            buf[0] |= 0x01;
                            buf[3] = transparentIdx;
                        }
                    }
                    fout.Write(buf, 0, count);
                }
            }
            while (count > 0)
            {
                count = fin.Read(buf, 0, 1);
                fout.Write(buf, 0, 1);
            }
            fin.Close();
            fout.Flush();
            return new Bitmap(fout);
        }
...Показать Скрыть
8. Александр Шкураев (salexdv) 16.12.13 17:06
(7) Каково практическое применение этого?
9. Ийон Тихий (cool.vlad4) 16.12.13 17:08
(8) salexdv, печати, факсимиле. такое же как и у http://infostart.ru/public/186861/
10. Александр Шкураев (salexdv) 16.12.13 17:16
(9) Я понял, надо будет доработать. Спасибо за идею!
11. Макс Зеленский (mzelensky) 18.12.13 09:43
(9) cool.vlad4, Я бы лучше добавил не "прозрачность", а возможность добавления "Шумов". Для факсимиле и печатей это более интересно будет.
12. Сергей Кудашкин (sikuda) 20.12.13 17:26
(0) Хорошее, но тяжелое решение(из пушки по воробьям). Написал попроще http://infostart.ru/public/242659/
13. Виталий Марков (VitalMakarr) 11.03.15 06:27
Зачем ограничиваться узкими возможностями. Попробуйте http://infostart.ru/public/322956/
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа