|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
Короче скрин прилагаю. В качестве источника изображения используется ч/б файл (глубина цвета 1), который масштабируется под размер Picturebox. Для масштабирования используем GDI+ в .Net напр. New Bitmap(file/другой bitmap) (можно ручками через Graphics в полном соответствии с чистым GDI+) -но это одно и то же. Задница в том что при отображении в .Net-Picturebox изображение рисуется точками и без всякого сглаживания. На 8-ке еще не очень заметно (хотя подозрение возникло еще вчера), но попробовал на XP и меня взбесило. Потом попробовал просто загрузить файл в PictureBox : Код: vbnet 1.
Такое же дерьмо. Эффект похож на то как изображаются подобные (ч/б) картинки в стандартных просмотрщиках на XP (хорошо) и на вистообразных Vista-8.1 (х*ево). В VB6-Picturebox все всегда отображается хорошо (со сглаживанием), и на Win8.1 тоже. Предполагаю, виноват Picturebox в .Net. Такое качество устраивать не может. Че делать то? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 02:04 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
Дмитрий77но попробовал на XP и меня взбесило. зато в Windows 95 уже всё ОК, правда в DOS 6.11 не очень, тоже не знаю что с этим делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 02:28 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
Дмитрий77, 1 минута гугления https://social.msdn.microsoft.com/forums/ru-RU/b0be2b82-c690-4e87-83d2-5baaf2f276cc/-picturebox-visual-basicnet-2010-express чудеса, правда? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 02:33 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
hVostt, хорош язвить. На 8.1-ке ситуация сильно лучше, но "точки" в левой картинке все равно глаза режут, или не видно? Предлагаешь дербанить класс PictureBox? Потому что от того способ готовки самого bitmap абсолютно не влияет на визуальное качество отображаемой картинки. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 02:52 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
Дмитрий77, чё гадать на кофейной гуще-то? ясен пень, что дело в режимах интерполяции и сглаживания . что касается отрисовки пискельных изображений в масштабе 1:1 — то никакое уродование изображения недопустимо, оно должно отображаться как есть. при масштабировании исопльзуется интерполяция. в VB6, сделанном для тупой деревенщины заранее задан тот режим интерполяции, который бы устроил большинство. я же дал ссылку, вся необходимая инфа по этой теме гуглится за 5 секунд. зачем вот это вот гадать, как там в Window 8, XP, или ещё где-то? один и тот же алгоритм будет одинаково работать хоть на холодильнике, хоть на космическом оборудовании. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 03:31 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
hVostt, ну хорошо у меня получилось. Я сделал с теми же флагами, с которыми делал zoom подобным картинкам через GDI+. Код: 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.
Все, стало как в VB6. Отлично. Но я вынужден добавлять эти Picturebox-ы кодом, чего я делать не люблю. Как мне это применить к уже нарисованным оригинальным Picturebox? Присобачивая класс через HandleCreated/HandleDestroyed (как делаю для WndProc)? >в VB6, сделанном для тупой деревенщины заранее задан тот режим интерполяции, который бы устроил большинство. Ну и нормально там по дефолту. А в .Net извини, делать такое дефолтное гавно без возможности хотя бы задать что-то в штатных свойствах контрола, это думаю неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 03:45 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
hVostt, да спасибо тебе, а то до меня бы не доперло как и что искать. Мне всего-то от GDI+ надо zoom, отображение и сохранение в различных форматах, причем все ч/б, а тут такая подстава на ровном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 03:50 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
Дмитрий77Но я вынужден добавлять эти Picturebox-ы кодом, чего я делать не люблю. Ну ок, определи где-нибудь в публичном статическом классе вот этот метод: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
И затем указывай его для события OnPaint во всех своих PictureBox-ах. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 03:53 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
hVostt, извини, но сейчас откровенно туплю. >И затем указывай его для события OnPaint во всех своих PictureBox я положил PictureBox2 на форму, вижу только событие Paint. Ну попробовал на дурака: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Оно естественно не работает. Я так понимаю надо класс как выше (myPicBox) где-то пристыковать к уже имеющемуся PictureBox-у, но где не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 04:19 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
Дмитрий77, фих его знает как оно там в VB.NET, но вот вариант на C# от такой публичный статический класс со статическим методом: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
затем ВАРИАНТ 1 в код формы ручками прописываешь по 1 строчке для каждого PictureBox-а Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
ВАРИАНТ 2 опять таки в код формы надо прописать один метод Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
и можно етот метод теперь для каждого бокса выбирать из дропдауна ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 05:58 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
hVostt, Мои изыскания на эту тему следующие: 1. Код: vbnet 1. 2. 3.
Мало того что неудобно, так еще и динамическое Dock=Fill хаотически глючит, т.е. рисунок начинает когда ему вздумается залезать под скажем верхнюю и нижнюю панельки. 2. Ну в принципе я тут нашел другой метод. Кидаешь куда надо родной PictureBox. Идешь в файл Private Sub InitializeComponent() -в VB.Net это в отдельном "скрытом" файле, там тупо в 2-х или 3-х местах меняешь As...Picturebox на As myPicBox - и усе, он остается в конструкторе но уже как myPicBox - с переопределенной OnPaint. 3. За поддержку спасибо, надо будет воспроизвести что ты сделал, м.б. пригодится как нибудь. НО САМЫЙ П...Ц НЕ В ЭТОМ Не надо ничего этого. PictureBox не виноват. Виновато: Код: vbnet 1.
Если по-порядку: 1. У меня в VB6 был такой хороший код (когда я делаю Zoom): Код: 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.
2. Я его тупо и честно перекатал на .Net 17349261 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
3. Потом меня вдруг "стукнуло", что нахрена все это нужно, типа какая в .Net афигенная автоматика и я сдуру заменяю все эти интерполяции 2-мя строчками : Код: vbnet 1. 2.
4. На 8.1 я сходу не понял что натворил, там качество хоть и теряется, но мало заметно. 5. А сегодня пошел тестить на XP и увидел. 6. Поскольку мини-тест (после подсказки с OnPaint) я делал одной строчкой без своего MultiPage класса Код: vbnet 1.
то ошибочно решили что проблема в Picturebox, и правка OnPaint типа лечит. 7. У меня глаза еще раз округлились, когда я имплементировал этот OnPaint в проект, пошел проверять на XP и увидел ту же мазню из точек. Т.е. я подсунул в Picturebox исходно испорченный Zoom-bitmap низкого качества и OnPaint здесь уже не поможет. Когда вернул на место интерполяции в ф-ции Zoom, все стало нормально с дефолтным PictureBox. Короче зло сидит в конструкциях вида Код: vbnet 1. 2.
а никак ни в OnPaint Picturebox-а. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 07:23 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
Дмитрий77, фух, ну слава богу, разобрались ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 07:35 |
|
Чудовищная порча картинки в Net-Picturebox
|
|||
---|---|---|---|
#18+
hVostt, коль уж тему затронули hVosttзатем...ВАРИАНТ 1 На VB это будет думаю так: Код: 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.
Но это эквивалентно моей попытке выше: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
с разницей что ты посылаешь обработку события в "другой класс" (чтоб типа не дублировать одинаковый код). Только это никоим образом ни переопределяет внутреннюю On Paint() для уже добавленного оригинальногоо контрола и дает нуль эффекта. Я гуглил, но думаю единственный способ влезть в OnPaint() это переопределить контрол о чем говорилось выше. А в плане "бытового комфорта" (если это уместно так назвать), кинуть на форму оригинальный и поменять его класс в паре строчек сгенерированного студией кода. Ну, проблема то решена. Зато теперь знаю что через New Bitmap(file) даже элементарную картинку грузить нежелательно. Буду пользоваться своим мультифрейм классом, который готовит эту картинку с интерполяцией. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2015, 08:59 |
|
|
start [/forum/topic.php?fid=20&msg=38897766&tid=1401824]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 332ms |
total: | 458ms |
0 / 0 |