|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Когда-то написал конвертер в SFF-формат (Modified Huffman): Конвертер TIFF(BMP...)->SFF самому написать реально? ... Сильно врубаться еще раз в это кодирование желания нет, но перегнать на .Net надо. И вот торможу слегка: Берется DIB-bitmap: Код: vbnet 1.
На него проецируется картинка, не суть вопроса. Суть в параметре pBits. ppvBits (out)A pointer to a variable that receives a pointer to the location of the DIB bit values. Т.е. ppvBits -грубо двумерный массив байтов Dim bDib() As Byte размером ScanLine_lenth * Height Т.е. в VB6 поступал так: Код: 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.
Фишка в том, что у меня в итоге есть двумерная матрица bDib() и я могу обратиться к любому байту bDib(x, y) этой матрицы. И вот я пытаюсь это перегнать на .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.
И понимаю что все не просто. 1) У меня нет CopyMemory. Я ее естественно не собираюсь использовать. Есть Marshal, но я пока абсолютно не понимаю как его применять и какой его метод пользовать. 2) У меня нет Function VarPtrArray Lib "msvbvm60.dll", применять ее в .Net однозначно не имею права, это даже не чистый Win32. 3) У меня компилятор авансом ругается на bDib(x, y), типа не указана мерность/размерности массива Dim bDib() As Byte . VB6 его как-то масштабирует через VarPtrArray/SAFEARRAY2D/CopyMemory хз как. Ну т.е. мне как-то надо получить матрицу bDib(x, y) as Byte из pBits (A pointer to a variable that receives a pointer...) Width и height мне известны. (при этом не должно быть просадки по скорости из-за например дурацкого алгоритма заполнения массива байтов, кодирование в принципе штука не быстрая) Есть идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2015, 23:24 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
трактуйте как одномерный массив pBits - unsafe указатель ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2015, 23:42 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропилтрактуйте как одномерный массив Тогда придется в алгоритм врубаться опять, а этого делать неохота, все кроме собственно получения матрицы фактически даже не требует правки кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2015, 23:53 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Дмитрий77, трудно смещение рассчитать типа i*stride+j ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 00:07 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропил, врубаться надо. а в двумерный никак? Хотя я честно и на VB6 плохо понимаю как он так лихо пакует именно в двумерный. Это при том, что ни мерность, ни размерность bDib() я нигде заранее не указываю. Ну по идее рассчитать то ее можно: ScanLine_lenth =width/8=1728/8=216 по x (0 To 215), ну и (0 To Height-1) по y, то что я пишу в SAFEARRAYBOUND(0 to 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 00:23 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Дмитрий77врубаться надо. да, в простейшую адресную арифметику ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 00:28 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропил, Попытался сначала объявить так (как двумерный): Dim bDib(ScanLine_lenth, Height) As Byte Но не хочет Marshal в двумерный копировать, нет видимо такой ф-ции Ну допустим. Хорошо, пусть будет одномерный. В конце концов bDib(x , y) можно заменить на что-то типа bDib(x + y * ScanLine_lenth), и наверно этого достаточно Попытался так Код: vbnet 1. 2.
Err.:Дополнительные сведения: Значение не может быть неопределенным. Рискнул так (там же вроде указатель на указатель): Код: vbnet 1. 2. 3. 4.
Та же ошибка. С арифметикой ладно. Получу картинку вверх ногами, буду думать где ошибся. Одномерный то хоть как получить? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 01:08 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропил, похоже получилось вот так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
А сразу не вышло, потому что у меня в CreateDIBSection случайно затесалась "невинная" ошибка: Код: vbnet 1. 2. 3. 4.
Было объявлено ByVal, обычно ни на что не влияет, пока не начнешь доставать бит-матрицу рисунка. Ну, т.е. картинку получил, в SFF-вьюере она открылась, вроде не косая, хотя напрячься думаю надо на предмет не съел ли я одну-две скан-линии случайно. =================== Вопрос: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
В .Net оптимизировать как-то можно? В VB6 помнится долго спорили кажется об них, ExamineBit вызывается 8 раз для каждого байта матрицы, хотя я и упростил до невозможности добавив частные случаи. Т.е. несмотря на все оптимизации, GS делает аналогичную задачу быстрее (3 секунды против 33 для 52-страничного файла). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 02:07 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
( 3 секунды против 33 для 52-страничного файла). 33 секунды -это VB6, чего вышло в .Net я еще не глядел. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 02:09 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Одинаковый результат по скорости для VB6 и .Net, главное не хуже. Нечего там похоже оптимизировать, сойдет. Если только VB-шные FreeFile/FileOpen/FilePut/FileClose на .Net-овские аналоги поменять как они советуют, но я думаю это копейки. Бенедикт, спасибо за идею с одномерным массивом. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 04:11 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
2 ^ n вместо сдвига -это ж надо такое придумать "Оптимизация" с проверкой на 0 и 255 - задушил бы :) А копирование зачем - unsafe pointer позволит без этого обойтись И еще много над чем поработать есть ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 05:35 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропил, извини, назвал тебя Бенедиктом случайно. Изопропил2 ^ n вместо сдвига -это ж надо такое придумать В VB6 не было сдвига. Как? Приведи код. ИзопропилОптимизация" с проверкой на 0 и 255 - задушил бы :) Не торопись душить. Ты же не знаешь предмет. 12735582 авторХотя...большая часть изображения (незакодированного) -белый лист (или повторяется черное)... Стало быть GetBitX(255,a) и GetBitX(0,b) можно и не вычислять по 8 раз, результат и без вычислений ясен. ИзопропилА копирование зачем - unsafe pointer позволит без этого обойтись. Как? Приведи код. ИзопропилИ еще много над чем поработать есть Конечно. Еще y * ScanLine_lenth можно по 1728 раз не вычислять, но я попробовал убрать и скорости это не прибавило. Самое смешное будет тогда когда поработав дней этак несколько экономия будет 0,5сек из 20-ти. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 06:13 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Дмитрий77, Строки откуда взялись? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 06:18 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Есть оригинальный код не на Бейсике? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 06:24 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропил, 12737548 Весь алгоритм под вторым спойлером. Ф-ция кодировки страницы это SFF_writePage Хотя я уже плоховато помню, там черт ногу сломит. Смысл, пишутся подряд в строку нулики-единички, как г-н Huffman придумал, потом это все пакуется в байты. Код так или иначе безошибочный, я над ним тогда долго работал. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 06:31 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
ИзопропилЕсть оригинальный код не на Бейсике? Мой и есть оригинальный, хотя я конечно подсматривал в GS, но весьма поверхностно. Описание алгоритма и все что по теме: 12700450 и т.д. Но поверь, мне второй раз во всем этом копаться не хочется. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 06:40 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Код может и безошибочный, но страшноватый Замечания разумные уже тогда были сделаны Резервы для оптимизации очень большие, но нужно вернуться чуток назад, дабы извести следы борьбы с инструментом(Бейсиком) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 06:50 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 08:09 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропил, ну допустим немного поработать можно для общего развития. Хорошо, я два конкретных вопроса выше 17422444 задавал: 1. Код: vbnet 1. 2.
Ну да, я копирую массив целиком. А вот в VB6 я похоже массив не копирую. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
И свистопляски с SAFEARRAY2D сдается мне и делаются за ради не копировать массив. Да еще и сразу как с двумерным работаем. >pBits - unsafe указатель Ну и как тогда в .Net сказать чтоб bDib() сразу использовал pBits? (по сути это ключевой вопрос этого топика, видимо не дорешенный) P.S. Хотя я не думаю, что разовое копирование всего bit-массива занимает вагон времени (тесты дают одинаковую скорость в .Net и VB6) 2. Код: vbnet 1. 2.
Ну и как это через "битовый сдвиг" переписать? Ну, основные "тормоза" в алгоритме конечно из-за строк. Но в силу алгоритма там без строк похоже не обойтись. Там же весь смысл, чтоб эти от балды взятые 1-ки и 0-ки в строчку выписать, а потом с ними колдовать. Т.е. ну да, для существенного ускорения только C++, где другие методы работы со строками. А вот эти все "оптимизации" это спички, и все что по существу я мог выжать, я выжал тогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 16:11 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Дмитрий77Но в силу алгоритма там без строк похоже не обойтись. почему бы сразу из битовых строк результат не клеить? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 16:22 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Дмитрий77 Ну и как тогда в .Net сказать чтоб bDib() сразу использовал pBits? ну как-то так Код: c# 1. 2. 3. 4. 5. 6. 7.
как это на бейсике - вам виднее ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 16:36 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Изопропилну как-то так Код: c# 1.
как это на бейсике - вам виднее А вот не виднее. хз как на VB это сделать. В VB6 всегда используется CopyMemory (MoveRtlMemory родное название кажется). В .Net то же самое это Marshal. В приведенном VB6 примере с SAFEARRAY2D используется хитрость, за счет чего массив не копируется, хотя до конца все же не уверен, но по-любому в .Net у меня нет VarPtr, StrPtr, VarPtrArray, кот. по сути нужны для "разворачивания объекта из указателя". >почему бы сразу из битовых строк результат не клеить? Это как? Там же количество бит неровное? И иначе как строками это не запишешь. И потом там не тупая склейка, а анализ и упаковка того что склеили. Что вкладываешь в слово "битовая строка"? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 16:53 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Дмитрий77, http://converter.telerik.com/ Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 17:01 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Roman Mejtes, сразу скажу, не уверен, что сработает. уже очень давно я забил на VB.NET ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 17:02 |
|
GDI-Bitmap, работа с DIB bit двумерным массивом, SAFEARRAY2D и VarPtrArray в .Net как?
|
|||
---|---|---|---|
#18+
Дмитрий77Что вкладываешь в слово "битовая строка"? битики упакованные в байты Дмитрий77Там же количество бит неровное? И иначе как строками это не запишешь так же как и на C. в модифицированном хаффмане что для факса - максимум 12 бит используется, в обычное короткое слово влезет. а дальше - сдвигать,складывать, записывать ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 17:04 |
|
|
start [/forum/topic.php?fid=20&msg=38915210&tid=1401761]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 342ms |
total: | 468ms |
0 / 0 |