|
Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
|
|||
---|---|---|---|
#18+
Грубо, имеем m_Bitmap As Bitmap Формат его может быть любой (т.е. допустима изначально цветная картинка) Надо его сохранить в файл (TIFF, BMP чего угодно), но именно в черно/белом варианте (.biPlanes = 1,.biBitCount = 1) Вот стабильный код VB6, который это делает (на примере TIFF): Код: vbnet 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.
Пару слов по коду: чисто средствами GDI++ почему-то не получается, поэтому приходится прибегать к чистому GDI. Т.е. алгоритм такой: 1) Создается пустой GDI - HBitmap через CreateDIBSection но что важно уже требуемого формата (.biPlanes = 1,.biBitCount = 1). 2) Исходный(возможно цветной) GDI+ m_nBitmap конвертится в GDI - HBitmap через GdipCreateHBITMAPFromBitmap, а далее преобразуется в IPictureDisp через CreateIPictureDispFromHBITMAP 3) Далее мы используем метод Render (IPictureDisp), т.е. накладываем исходную картинку на DIB-bitmap (созданный в п.1) 4) Далее из GDI - HBitmap создаем новый GDI+ nBitmap через GdipCreateBitmapFromGdiDib, он автоматом получается того же ч/б формата 5) Ну и этот GDI+ nBitmap сохраняем через GDI+ encoders в чего надо, в данном примере в "image/tiff" Пытаюсь это переложить на .Net. Вот мои наработки: Код: vbnet 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.
=== Первый вариант это в лоб. Естественно GDI+ заменяем на .Net -обертку - в этой части проблем нет, все Encoders и т.п. как по маслу. Что касается создания ч/б GDI HBitmap здесь тупо повторяем все API (обертки то нету), это понятно. Нестыкуется средняя часть , т.е. проецирование исходного m_Bitmap as Bitmap на DIB-GDI-Hbitmap Ну, допустим я .ToHBitmap ему сделаю. Но я в .Net не располагаю объектом вида IPictureDisp и его методом Render, который собственно и делает быстро все проецирование. (Ну и не факт что в .Net подобный IPictureDisp интерфейс нужен и есть гуд.) P.S. Есть еще StretchBlt (чтобы избежать IPictureDisp+Render) если уж идти по этому пути, но я не уверен, что это полный эквивалент и даст такую же производительность как Render. Как выкручиваться? === Второй вариант - пытаться все делать через GDI+. Но вот такая попытка на дурака: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
мгновенно выдает ошибку: Невозможно создать объект графики из изображения, имеющего индексированный формат пикселей. И видимо по этой причине в исходном VB6 все сделано с привлечением GDI а не чисто на GDI+. Но м.б. все же как-то можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2015, 17:38 |
|
Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
|
|||
---|---|---|---|
#18+
Дмитрий77 Нестыкуется средняя часть , т.е. проецирование исходного m_Bitmap as Bitmap на DIB-GDI-Hbitmap Ну, допустим я .ToHBitmap ему сделаю. Но я в .Net не располагаю объектом вида IPictureDisp и его методом Render, который собственно и делает быстро все проецирование. (Ну и не факт что в .Net подобный IPictureDisp интерфейс нужен и есть гуд.) P.S. Есть еще StretchBlt (чтобы избежать IPictureDisp+Render) если уж идти по этому пути, но я не уверен, что это полный эквивалент и даст такую же производительность как Render. Как выкручиваться? Ну вроде сделал через StretchBlt: Код: vbnet 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.
Вроде делает то что надо. Но у меня таки вопрос, м.б. кто в курсе IpictureDisp + метод Render это тоже самое что StretchBlt + SRCCOPY ??? Потому что счас оставлю а потом окажется что совсем не то, и картинки гадятся. Еще оговорюсь что в данном случае никаких HALFTONE режимов я не использую (это насчет гадятся), исходные картинки - всегда ч/б TIFF, размер если и меняю, то сжатие-растяжение в 2 раза. А нужно именно контролировать 2 цвета чтобы из 2-х цветного TIFF не генерировался 32-битный bmp или jpeg при конвертации, а GDI+ это именно делает по дефолту при сохранении файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2015, 19:51 |
|
Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
|
|||
---|---|---|---|
#18+
Без (StretchBlt + SRCCOPY) / (IpictureDisp + метод Render) можно обойтись как и без конвертации исходного GDI+ Bitmap в GDI-Bitmap / IpictureDisp. Покопался в своих старых кодах... Т.е. я не могу через GDI+ рисовать поверх GDI+-bitmap, если он в формате .Format1bppIndexed Но никто мне не мешает рисовать этим (GDI+) методом поверх hdc, взятого из GDI-рисунка (biPlanes = 1,.biBitCount = 1). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
А вот без GDI-рисунка похоже не обойтись, хотя я и видел решение, когда рисуют поверх цветного GDI+ рисунка, а потом по пикселям копируют его в .Format1bppIndexed-bitmap, но это фигово и долго - каждый пиксель анализировать. Ну, т.е. остановился на таком конечном варианте: Код: vbnet 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.
Жаль что никто так и не подсказал ничего. Обертка GDI+ (System.Drawing) в .Net достаточно хорошо реализована. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2015, 16:46 |
|
|
start [/forum/topic.php?fid=20&fpage=91&tid=1401769]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
others: | 325ms |
total: | 479ms |
0 / 0 |