|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Пока что терзаю wiaaut.dll: Код следующего типа делает чего надо, напр.в bmp (напр.если 1 страница): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Но это хорошо, когда tiff 200х200, а если он 200х100, то при конвертации в картинку типа jpg-bmp его надо растягивать по высоте вдвое, иначе изображение будет сжато по вертикали. Ладно, делаем так, "выкрутились": Код: plaintext 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. 31. 32. 33. 34. 35. 36. 37.
В то же время редактор Paint при растягивании картинки по вертикали вдвое и сохр. в ч/б BMP делает приличную картинку. Как вернуть Img.PixelDepth назад в 1 или запретить увеличение до 32 я не знаю. В принципе еще существует GDI+ но это сложнее для понимания, и боюсь что наступлю на те же грабли. Задача собственно б/м прилично(без раздувания) растянуть Img, оставаясь в черно-белом цвете. Обратил внимание еще что при моем растягивании разрешение меняется с 204х98 на 96х96, размер с 1728х1194 на 1728х2388 точек . Чет я не допонимаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2010, 13:52 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Можно конечно чуть улучшить ситуацию для 200х100, забабахав проможуточную конвертацию tif=>gif=>bmp Код: plaintext 1. 2. 3. 4. 5.
но это конечно плохой вариант. Если не применять scale-фильтр, то сжатый bmp (глубина 1) можно растянуть в paint в 2 раза и получится 1728х2388 203х97 объемом в моем случае 0,5MB (jpg соотв.сильно меньше) к чему и имеет смысл стремиться. Только б вот как растянуть программно и правильно... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2010, 16:27 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Бенедикт,ау. Я так понимаю вы единственный кто здесь в этом чего-то реально шарит. Если есть время, гляньте.. P.S. я отчаялся делать поиск по словам WIA, GDI, stretch и т.п. и сделал поиск по слову Бенедикт ...и это дало нек. положительные результаты Способ tiff->(bmp,jpg..) я нашел, но немного кривоватый. если 200х200 то просто конвертация через WIA (ч/б палитра сохраняется) здесь просто,не стоит заморачиваться если 200х100 (требуется растяжение в 2 раза) изобрел гибрид (WIA)+(GDI)+(GDI+) 1) Конвертация через WIA без растягивания строго в bmp (ч/б палитра сохраняется) 2) Открываем этот tmp-bmp через GDI как StdPicture 3) Растягиваем через GDI в 2 раза 4) Сохраняем через GdipCreateBitmapFromHBITMAP (GDI+) в bmp,jpg,png,gif п.п. 2-4 делаются как здесь /topic/360201#3424634 FitToSizeBitmap слегка переписывается, чтоб растягивала-сжимала SavePictureToJPEG() ->по аналогии делаем SavePictureToBMP(),png и т.п. это осилил. Получается примерно следующее: Код: plaintext
Для конвертации в bmp и png выигрыш в размере файла получается значительный(сохранение ч/б палитры), для jpg и gif особой разницы если просто делать фильтр "Scale" через WIA это не дает, т.к. все равно будет соотв. 24bit и 8bit, хотя кажется все равно чуть быстрее. Код конечно получился через одно место (промежуточный bmp на диск), окультурить бы. По идее взять бы класс CMultiFrameImage из примеров приведенных Бенедиктом. /topic/711100&hl= и дописать его на предмет сохранения в разные форматы... Но я не мастер по классам, это раз, у меня не получилось. Во вторых, возникли сомнения на счет GDI+ Я игрался с этим примером /topic/585476&hl=tipp0658 http://www.activevb.de/tipps/vb6tipps/tipp0658.html да он открывает файл через GDI+ функцией DrawImageFromFile но увы сразу делает его цветным. т.е. также как и WIA и если собака в этом, т.е. GDI+ (а WIA как было упомянуто основана на GDI+) не умеет преобразовывать не раскрашивая в 32 bit, то тогда дело дохлое и любые усилия будут напрасны. А открывать сразу через GDI (без +) я не могу, т.к. у меня tiff и нужен + либо WIA, что тоже самое, сохранение во временный tmp-bmp конечно вариант, и задачу можно считать решенной,но все же. И еще (мелочи конечно...) разрешение 96х96 экрана кот. делает FitToSizeBitmap.... вообще-то красивше и правильнее было бы оставить оригинальное, т.е. 204х98 в моем случае Специалисты, Бенедикт, что скажете? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2010, 22:26 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Дмитрий77, мне сейчас трудно найти время для форума. Посмотрите приложенный обновлённый класс CMultiFrameImage, в нём появился метод Frame1bpp (перевод в формат 1 бит на точку и масштабирование по вертикали средствами GDI). Результат можно напрямую сохранять в .bmp стандартной функцией SavePicture, но она не пишет разрешение. Но лучше придумать что-нибудь другое, сохранять в тот же TIFF с помощью GDI+, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2010, 16:21 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Бенедикт, спасибо что откликнулись. Если делать совсем красиво, то боюсь нужна чуть ваша помощь. Frame1bpp я проверил, все работает, она по сути заменяет шаг 1) Конвертация через WIA без растягивания строго в bmp (ч/б палитра сохраняется) (см.мое сообщение) а также вбирает в себя 3) Растягиваем через GDI в 2 раза >можно напрямую сохранять в .bmp стандартной функцией SavePicture это по сути подводит меня к моему промежуточному tmp-bmp после чего все делается точно также: 2) Открываем этот tmp-bmp через GDI как StdPicture //3) Растягиваем через GDI в 2 раза// этот шаг теперь не нужен, т.к. уже растянули 4) Сохраняем через GdipCreateBitmapFromHBITMAP (GDI+) в bmp,jpg,png,gif Воткнуть сохранение через GdipCreateBitmapFromHBITMAP (GDI+) в ваш класс я попытался, но у меня не получилось Попытался также 1) тупо добавить ModuleGDIp (независимый от класса) из вашего же примера 2) переписать Frame1bpp->Frame1bppL, удалив Set Frame1bpp = CreateIPictureDispFromHBITMAP(hbmDst) и заменив на Frame1bppL = hbmDst 3) на этом этапе отвязаться от класса и сделав Код: plaintext 1. 2. 3. 4. 5. 6.
Код: plaintext 1.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
MsgBox hndl возвращает long, но на этапе SaveHBitmapToBMP VB рушится, поэтому и остается сохранять SavePicture, а потом переоткрывать как StdPicture Либо нужен ответ на вопрос Как конвертировать IPictureDisp->StdPicture, хотя чувствую что это также лишне как и tmp-bmp >сохранять в тот же TIFF с помощью GDI+, сохранять TIFF меня как раз меньше всего интересует, т.к. у меня на входе он и так всегда есть, если только переконвертация в различные другие форматы lwz/uncompressed и т.п. а вот jpg/png/gif/bmp и надо, но это я повторюсь уже осилил "image/bmp", uEncCLSID 'image/png","image/gif"... вопрос как подвести ваш класс к этому шагу(как вставить в класс этот шаг) без временных bmp ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2010, 13:16 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Дмитрий77, IPictureDisp отличается от StdPicture, если не ошибаюсь, только тем, что к StdPicture можно применить New. Объект типа StdPicture поддерживает интерфейсы IPictureDisp, IPicture, IDispatch, IUnknown. При Type = PICTYPE_BITMAP (1) свойство Handle возвращает HBITMAP, т. е. не надо промежуточных сохранений во временный bmp, чувство не обманывает. Null это что? Добавил метод SaveFrameAs1bppPNG(), на основе Frame1bpp(). Хотя, конечно, для единства стиля лучше бы перейти к решению на GDI+ только. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2010, 02:58 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Бенедикт, спасибо,так конечно сильно красивше. Да еще и с заданием разрешения, круто. если в другие форматы 1) to GIF-> элементарно заменой на "image/gif" (8bit будет естественно) Я правильно понял что GIF нестандартные Resolution не поддерживает? 2) to JPEG пришлось чуть дописать: (24bit будет естественно) Код: plaintext 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109.
If GetEncoderClsID("image/bmp", EncoderCLSID) > 0 похоже 0 дает, если убрать условие то все корректно. Код: plaintext 1. 2. 3. 4. 5. 6. 7.
>Хотя, конечно, для единства стиля лучше бы перейти к решению на GDI+ да GDI+ похоже цветность очень любит добавлять при преобразованиях типа растяжение >Null это что? Гы...Null это нуль, пустое место...что-ли Ну я документацию то C-шную читал про параметр uEncParams ByVal 0& для меня тупого сложно родить, vbNull не прокатил, а Null съелся, в синенький окрасился, заработало, я и успокоился. Извините, если что не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2010, 12:03 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Дмитрий77, >1) ... Я правильно понял что GIF нестандартные Resolution не поддерживает? В кратком описании формата GIF полей для хранения разрешения картинки в явном виде нет. Не смотрел, есть ли в полной спецификации. >3) Да, ошибка, надо сравнивать номер кодировщика на >= 0. >да GDI+ похоже цветность очень любит добавлять при преобразованиях типа растяжение ... но зато имеет функцию GdipBitmapConvertFormat(). >Null VB-шный Null это Variant подтипа vbNull (к тому же в данном случае передаваемый по ссылке), сравните с ((void *)0) (C) или 0 (C++). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2010, 02:55 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Спасибо, Бенедикт. В принципе крайние варианты и так получились очень неплохие. Будет настроение, поиграюся еще, тема графики довольно интересна для меня... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2010, 00:08 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
Бенедикт, попытаюсь продолжить тему, сейчас решил повозиться с tiff форматами. Продвижения есть, но куча вопросов: По образу-подобию создаем в вашем CMultiFrameImage ф-цию SaveMultiFrameAs1bppTIFF Код: plaintext 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125.
использовал http://www.activevb.de/tipps/vb6tipps/tipp0660.html но суть понятна. Проблема #1 Если StartFrame=EndFrame, т.е. выдергивается одна страница (можно даже сильно упростить приведенный код без добавления Multi), то эта страница при любых tiff-compression получается слегка бракованная. Т.е. она нормальная с т.зр. виндов, но может не восприниматься другими программами. Поиск дал намек. Проблема возникает в tag=266 Reserved Bit Order или FillOrder Для исправления достаточно сделать: Код: plaintext
Проблема #2 Код: plaintext
Сразу скажу, что немецкий код с этим форматом не всегда справляется даже с точки зрения самих виндов. Если например исходный tiff был в TiffCompressionCCITT4, то это черный квадрат. Код основанный на CMultiFrameImage (приведен выше) с т.зр. виндов справляется лучше (с учетом поправки на проблему 1), однако даже если заставить манипуляцией с tag=266 этот файл увидеть в "неродном" вьюере, то он будет битый (с полосами и т.п.), а многостраничный будет сильно битым. Проблема #3 Связана с задачей конвертирования 204x98 в 204x196. 1) Во-первых надо растянуть по вертикали в 2 раза 1728х1190 скажем =>1728x2380 2) Во вторых надо изменить разрешение: GdipExec GdipBitmapSetResolution(nBitmap(i), DpiX, 2*DpiY) (со вторым проблем нет) (приведенный код основанный на CMultiFrameImage с этой задачей справляется, но есть проблема 1, кот. меня не очень радует) Сразу скажу что для всех форматов кроме CCITT3 немецкий код мне нравится больше, т.к. он не порождает проблему 1, да и быстрее, т.к. сразу закладывает из файла в nBitmap а не в IDisplay, не вызывает GDI(без+) и т.п. Логично задать вопрос: м.б. можно все-таки через GDI+ сделать GdipExec GdipBitmapУстановитьШиринуВысоту(nBitmap(i), ширина, 2*высота) работая непосредственно с nBitmap без проекций на картинки, ну и соотв. без игр с туда-сюда цветностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 14:57 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
>Проблема #2 >TiffCompressionCCITT3 Блин, с этими CCITT Group 3 (1D Fax) Reversed Bit Order файлами даже libtiff не справляется. tiffcp.exe "test.tif",5,6 "testx.tif" (вытащить-слепить стр.6,7) tiffsplit.exe "test.tif" (разбить на страницы) Если test.tif CCITT Group 3, то файлы, производимые этими командами будут битые Kodac Imaging однако коректно справляется... Microsoft Fax напр. использует CCITT4, там проблем нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 17:21 |
|
Корректная конвертация ч/б TIFF(200х100)->BMP,JPG и т.п.
|
|||
---|---|---|---|
#18+
БенедиктДмитрий77, Добавил метод SaveFrameAs1bppPNG(), на основе Frame1bpp(). Хотя, конечно, для единства стиля лучше бы перейти к решению на GDI+ только. Бенедикт, Вернулся к этой теме. Допустим у меня есть картинка 2386х1620, а мне надо получить 1728х2340 (изменить размеры) По высоте, ладно, научился, там все сделано; а сжать/растянуть по ширине, у меня через render получилось почему-то зеркально только, либо черный лист. Или допустим ширину привести к 1728, а высоту пропорционально, но при этом нарастить лист "белым" до размера 2340 Или наоборот привести высоту к 2340, а ширину нарастить до 1728 белыми полями. (т.е. вписать в рамку максимально). Или если я хочу перевернуть картинку на 90градусов? Уж больно ваш этот класс нравится... Задача как бы получить "правильный tiff" из произвольного рисунка (произв. размер, разрешение, ориентация). Как tiff а не png, и как задать компрессиию - это я знаю Правильный -это 1728х2340 204х196 рисунок максимально вписан; вертикальная ориентация либо 1728х1171 204х98 рисунок максимально вписан+сжат вдвое по вертикали; вертикальная ориентация Сейчас пытаюсь хотя бы "растянуть" по W и H до произв. размера - по H без проблем, а по W ерунда пока. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2011, 17:06 |
|
|
start [/forum/topic.php?fid=60&fpage=104&tid=2158821]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
209ms |
get tp. blocked users: |
2ms |
others: | 358ms |
total: | 639ms |
0 / 0 |