IE2017

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

Программирование - Практика программирования

Иногда возникает необходимость повернуть картинку из 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
26
.zip 821,22Kb 26 Скачать

См. также

Комментарии
1. Сергѣй Батанов (baton_pk) 207 16.12.13 15:19 Сейчас в теме
2. Борис Котляр (bborisko) 20 16.12.13 15:26 Сейчас в теме
Вот только размер у imagemagick большой.
3. Сергѣй Батанов (baton_pk) 207 16.12.13 15:45 Сейчас в теме
(2) bborisko, не поспоришь.
Но для установки на сервер для обработки картинок на сервере - самое то.
4. Ийон Тихий (cool.vlad4) 41 16.12.13 15:54 Сейчас в теме
(2) bborisko, но зато он проверен временем и открытостью кода. к тому же там com сервер есть, что позволяет его и на сервере приложений использовать.
gaglo; baton_pk; +2 Ответить
5. Ийон Тихий (cool.vlad4) 41 16.12.13 16:04 Сейчас в теме
вот кстати, что было бы несколько интереснее, это "интеллектуальный" поворот. когда осуществляется поворот скана в правильное для чтения положение.
6. Александр Шкураев (salexdv) 1250 16.12.13 16:46 Сейчас в теме
7. Ийон Тихий (cool.vlad4) 41 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) 1250 16.12.13 17:06 Сейчас в теме
(7) Каково практическое применение этого?
9. Ийон Тихий (cool.vlad4) 41 16.12.13 17:08 Сейчас в теме
(8) salexdv, печати, факсимиле. такое же как и у http://infostart.ru/public/186861/
10. Александр Шкураев (salexdv) 1250 16.12.13 17:16 Сейчас в теме
(9) Я понял, надо будет доработать. Спасибо за идею!
11. Макс Зеленский (mzelensky) 53 18.12.13 09:43 Сейчас в теме
(9) cool.vlad4, Я бы лучше добавил не "прозрачность", а возможность добавления "Шумов". Для факсимиле и печатей это более интересно будет.
12. Сергей Кудашкин (sikuda) 497 20.12.13 17:26 Сейчас в теме
(0) Хорошее, но тяжелое решение(из пушки по воробьям). Написал попроще http://infostart.ru/public/242659/
13. Виталий Марков (VitalMakarr) 35 11.03.15 06:27 Сейчас в теме
Зачем ограничиваться узкими возможностями. Попробуйте http://infostart.ru/public/322956/
Оставьте свое сообщение