Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GDI+ не растягивает картинку до конца 
V
    Опции темы
Coder
Дата 24.2.2010, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Приветствую!

Столкнулся с такой проблемой - при сильном (относительно) растягивании картинки средствами GDI+ правая и нижняя стороны, как бы не дотягиваются до нужного размера. Этот эффект хорошо видно на скриншоте - картинка должна закрыть красную рамку, но вместо этого образуется щель. Притом размер этой щели зависит от растяжения.

Вот пример кода, которым прорисовываю картинку:
Код

var
  Ii : TGPImage;
  destRect : TGPRect;
  P : TGPPen;
begin
  Ii:=TGPImage.Create('D:\Photo\Чечня\Чёрная акула.JPG');   // картинка размером 640*480
  JpgGDI:=TGPGraphics.Create(_dc);

  // координаты вывода и размеры
  destRect.X:=10;
  destRect.Y:=10;
  destRect.Width:=1200;
  destRect.Height:=500;

  // кисть для рамки
  P:=TGPPen.Create(MakeColor(255,0,0),1);

  // рамка для картинки - по идее картинка должна закрыть однопиксельную рамку
  JpgGDI.DrawRectangle(P,destRect);   
  JpgGDI.DrawImage(Ii,destRect);
end


Библиотеку для работы с GDI+ брал с http://www.progdigy.com/

Это глюк или особенность? И есть идеи, как с этим бороться?

Это сообщение отредактировал(а) Coder - 24.2.2010, 04:35

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  gdi_.jpg 128,57 Kb
PM MAIL   Вверх
AntonN
Дата 24.2.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Привет Coder =)

А GDI+ обязательно? Билинейной фильтрации средствами GDI не достаточно?
преобразовать картинку в bmp пробывал?

Добавлено через 7 минут и 17 секунд
да и еще - в GDI canvas.Rectangle() рисует рамку от указываемого пикселя, т.е. 
Код

canvas.Rectangle(10,10,110,110);

тебе нарисует пиксели не в [10;10], а в [11;11] 

думаю тут аналогично


--------------------
user posted image
PM MAIL WWW   Вверх
Coder
Дата 24.2.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



О, AntonN! Здорово!!

У меня такая штука: пишу приложение на чистом WinAPI, картинок много, отрисовка/скрытие происходит часто - скорость важна. Я не знаю, как работают внутренние механизмы GDI+, но думаю при использовании GDI с различными преобразованиями скорость упадет. Я это только предполагаю, пока не проверял.

А использование GDI+ не принципиально. Сгодилась бы и сторонняя библиотека, но достойных и бесплатных реализаций под Делфи не нашлось, а самому писать, конечно, не вариант, т.к. это маааленький кусочек проекта, или одна из функций программы smile
PM MAIL   Вверх
AntonN
Дата 24.2.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



мне кажется просто рамку рисуешь не так (точнее она по правилам рисуется не как тебе надо). Нарисуй ее со сдвигом -1;-1 и она исчезнет, -2;-2 и будет торчать верхний край. Опыт провести smile

GDI достаточно быстрая вещь, но на простых операциях типа копирования канвы.


--------------------
user posted image
PM MAIL WWW   Вверх
Coder
Дата 25.2.2010, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



AntonN, нет, чем больше растягиваю картинку, тем больше щель образуется между рамкой. Одним пикселом не обойдешься, там будет хоть все 5.
Вчера попробовал  тоже самое штатными средствами Делфи - TJpegImage, TBitmat. Такого глюка нет! Сейчас буду пробовать перетянуть все к себе в проект и сравню быстродействие.
PM MAIL   Вверх
Coder
Дата 25.2.2010, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Итак, воспользовался двумя классами Делфи и GDI StretchBlt(). Щели пропали и все рисуется, как нужно. "На глаз" быстродействие не упало. Из того что заметно - изображение не такое четкое, как при растягивании средствами GDI+. Ну и режет глаз использование юнита JPEG и Graphics в WinAPI приложении. Сейчас попытаюсь избавиться от первый четырех строк кода и соответствующих юнитов:

Код

  Jpeg:=TJPEGImage.Create;
  Jpeg.LoadFromFile(JpgName);
  B:=TBitmap.Create;
  B.Assign(Jpeg);

  StretchBlt(_dc,x,y,w,h,B.Canvas.Handle,0,0,real_w,real_h,SRCCOPY);

PM MAIL   Вверх
AntonN
Дата 25.2.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Coder, 
Код

SetStretchBltMode(_dc, HALFTONE);
StretchBlt(_dc,x,y,w,h,B.Canvas.Handle,0,0,real_w,real_h,SRCCOPY);

а так? smile

ну а первые - это нормально, можно еще и поддержку png добавить smile


--------------------
user posted image
PM MAIL WWW   Вверх
Coder
Дата 26.2.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Итак, на третий день "разборок", перелопатив кучу материала (довольно низкого качества), я остановился на использовании Intel JPEG Library + GDI StretchDIBits(). 
IJL читает картинку и производит ее декомпрессию. Далее буфер в формате DIB попадает в функцию StretchDIBits(), которая рисует быстро и растягивает картинку без глюков.

Вот результаты замеров (время в мс, 3 теста для каждого варианта):

Intel JPEG Library + GDI StretchDIBits():
63
63
109

TJPEGImage + TBitmap + GDI StretchBlt():
188
125
312

GDI+:
250
157
343

Для тех, кто столкнется с этой проблемой:

Сразу просмотреть/прочитать это:
http://msdn.microsoft.com/en-us/library/dd145121(VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx
http://forum.sources.ru/index.php?showtopic=37666

Качать IJL отсюда (в комплекте хороший пример):
http://www.dencraft.fixer.ru/

Но, есть еще куда можно капнуть в этой задаче: StretchDIBits() судя по описанию сама поддерживает формат JPEG. Но в каком виде давать ей буфер с JPEG картинкой ни слова. Сам испробовал разные варианты - не получилось. Примеров так же не нашел (может плохо искал). Так что есть шанс отказаться еще и от Intel JPEG Library - тут уже к чистокровности WinAPI не придерешься smile 

Несмотря на абзац выше результатом я уже доволен - скорость супер, глюков нет smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.4477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.