| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Изменить размер PNG |
| Автор: Akella 1.8.2012, 13:02 | ||||
| Не могу найти нормально работающего примера, чтобы качественно увеличить PNG с alpha-каналом. Delphi XE2 На сайте абракадабры (EDN>>CodeCentral) есть примеры работы с PNG: http://cc.embarcadero.com/Item/25631, в том числе и есть пример процедуры SmoothResize. Там есть такой кусок кода:
Проблема в том, что у меня изображение имеет apng.Header.ColorType равный 3, а именно COLOR_PALETTE
поэтому вываливается Exception Я с изображениями вообще не работал. Поэтому нужна процедура изменения размера PNG. Или как "конвертировать" существующее изображение, чтобы эта процедура схавала мой png и не подавилась? Может можно как сконвертировать изображение из COLOR_PALETTE в COLOR_RGBALPHA или в COLOR_RGB? |
| Автор: Illusion Dolphin 1.8.2012, 16:29 | ||||
Вот как перегнать из PNG с COLOR_PALETTE в TBitmap:
Замем если получилось 24 bit каритинка то просто PNGImage.Assign делаешь, если же 32 бита получилось, то:
Работает 32\64 бита. Быстрее только ассемблер наверное. А дальше - функция SmoothResize |
| Автор: Akella 1.8.2012, 16:46 |
| ОК, спасибо, попобую завтра Добавлено через 50 секунд Я пробовал этот пример с GDI+ http://kachkarvv.org.ua/faq/src-delphi/delphi-jpg-gdi-rsz.php, вроде работает, но приходится через промежуточный файл. |
| Автор: Illusion Dolphin 1.8.2012, 17:01 | ||
GDI+ может работать через стримы (GdipLoadImageFromStream/GdipSaveImageToStream) так что можно без файлов обойтись и работать со стримами бещ лишних файлов. Но я не уверен что будет работать в случает прозрачной картинки (COLOR_PALETTE с прозрачностью). |
| Автор: Akella 2.8.2012, 10:33 |
мне кажется, что потеряется альфа-канал и картинка в итоге будет искажённой, а там цифры, которые мне нужно ещё распознать в текст :( Добавлено через 2 минуты и 51 секунду А как можно убрать альфа-канал, заменив прозрачность, например, на красный или синий цвет? Там прозрачные цифры, и мне их нужно распознать в текст. |
| Автор: x128 2.8.2012, 11:02 | ||
Не знаю как в Delphi XE2 обстоят дела с alpha-каналом для палитровых PNG, но в оригинальном компоненте который стал донором доступ осуществлялся напрямую через соответствующие чанки. Для палитры это TChunkPLTE, для прозрачности TChunktRNS.
для tRNS.PaletteValues[i] индексы i соответствуют индексам палитры и содержат значения альфа-прозрачности для каждого цвета в палитре. |
| Автор: Illusion Dolphin 2.8.2012, 13:12 | ||||||
А там разве зря 2 ветки - для прозначного и непрозрачного PNG?
Если не получается - можешь скинуть картинку для примера я посмотрю. Как сказал x128, возможно правильнее смотреть прозрачность через TChunktRNS чанк, но я не видел png, который бы неправильно отобразился в коде который дал я (если такой png есть просьба показать его |
| Автор: Akella 2.8.2012, 13:25 |
| Пока не пробовал. Но картнку на всяк случай приложил |
| Автор: Akella 2.8.2012, 13:28 |
Что за PRGB, где это объявлено? |
| Автор: Akella 2.8.2012, 13:32 |
| И PRGB32? |
| Автор: Akella 2.8.2012, 13:36 | ||
Я правильно объявил?
|
| Автор: Illusion Dolphin 2.8.2012, 20:23 | ||
Ох, тут придётся модифицировать код, т.к. он только для 8 бит, а тут 4.... |
| Автор: x128 2.8.2012, 21:27 |
| Прикрепил пример. В примере любой PNG приводится к единому формату RGBA и результат ресайзится. |
| Автор: x128 2.8.2012, 21:50 | ||
Хм... Заметил странную особенность, StretchBlt в режиме HALFTONE не сглаживает приложенную картинку при увеличении... Но это мелочи. Меня больше интересует, зачем нужно эту картинку обрабатывать с прозрачностью и зачем работать с PNG напрямую? Я так полагаю, что будет какая-то обработка и скорее всего распознавание и в таком случае достаточно получить битмап и без прозрачности.
|
| Автор: Illusion Dolphin 2.8.2012, 22:02 | ||
А вот и обновление, проверил со всеми вроде бы возможными форматами для COLOR_PALETTE:
Добавлено @ 22:10 x128, В твоём коде есть пара моментов: 1) Не thread-safe (если, конечно, это не требуется). В моём случае это поддерживается. 2) Не работает с некоторыми изображениями (если это важно - в аттаче пример). |
| Автор: x128 2.8.2012, 23:39 | ||
Действительно, что-то я с COLOR_GRAYSCALE тормознул... |
| Автор: Akella 3.8.2012, 09:05 | ||||
Да, имеено bitmap я в итоге и хочу получить!! Нормальный, читабельный bitmap. Теми простыми способами через <TImage>.Picture.Graphic с пересохранением, получается плохо. Компонента распознавания видиц цифры, но плохо распознает. А когда я исходный png конвертирую в bitmap с помощью ACDSee, то компонента распознавания прекрасно распознает, почти на 100%. Автор компоненты,которую я купил (winsoае ocr) молчит, никаких рекомендаций не даёт. |
| Автор: Akella 3.8.2012, 09:36 |
| Illusion Dolphin, ты так и не ответил, что за prgb и prgb32 |
| Автор: Akella 3.8.2012, 09:58 | ||||||||
x128, почему на этой строке src принимает значение nil
вызываю так:
|
| Автор: x128 3.8.2012, 11:14 | ||
Скорее всего, изображение не имеет альфа-канала. Перед вызовом ResizePNG, нужно преобразовать PNG через ConvertToRGBA. И еще, ResizePNG в это функция которая возвращает новый PNG, эсли ты не переделывал, то вызов должен быть другим.
|
| Автор: Akella 3.8.2012, 11:31 | ||||
но там тоже есть код:
|
| Автор: x128 3.8.2012, 11:55 |
Scanline и AlphaScanline немного разные вещи. Процедура ConvertToRGBA преобразовывает png в COLOR_RGBALPHA, а функция ResizePNG работает исключительно с этим форматом. Переписать можно как нужно или удобно, я просто хотел наглядно показать что и как. |
| Автор: Akella 3.8.2012, 12:10 | ||
| ага понял, спасибо Добавлено через 1 минуту и 30 секунд Теперь вопрос по преобразованию в BMP. Вот мой код
в итоге картинка bmp выглядит не совсем читабельно: ![]() как бы мне прозрачность перевести в белый цвет? |
| Автор: x128 3.8.2012, 14:10 | ||
как-то так:
|
| Автор: Akella 3.8.2012, 15:30 |
| Да вы просто шайтаны |
| Автор: Illusion Dolphin 4.8.2012, 15:38 | ||||||||
Вроде уже что надо было получили, но раз вопрос есть отвечу
Это описание пиксела для 24 и 32 битных битмапов, вот описание полное:
Я смотрю тут автоматизатор капчи делается, не знаю какое их количество, но если много или они не из главного потока обрабатываются то код с канвой будет раз на 10 случаев (приблизительно) выдавать пустой результат.
Применимо к моему коду там есть коментарий - "//set directly to 255 to disable transparency" - вот если проверить тут прозрачность то можно делать фон любого цвета устанавливая другие значения и если надо через прозрачность:
|
| Автор: Akella 6.8.2012, 09:21 |
нет, распознавать на картинках нужно номера телефонов |