#0
by H A D G E H O G s
Дня доброго. Это тема про Delphi. Конечно малореально, нуавдруг кто-то юзал. Нужно развернуть рисунок (точечный) на угол. SetWorldTransform великолепно его крутит, масштабирует, но когда я пытаюсь повернуть 60 мегабайтный bmp (10 метров в jpg) - он (вернее функция копирования в трансформированный Canvas BitBlt) работает криво - по результату у меня белое полотно вместо рисунка. В тоже время масштабирование осуществляется на ура. Пока поворот запилил через ScanLine, но он в 1.5-2 раза медленнее, чем через SetWorldTransform (2.5 секунд для 10 метров jpg).
#1
by H A D G E H O G s
Кот: function T_vk_object.Rotate(FromBitmap:TBitmap;Angle:real):TBitmap; function Min(const A,B:extended):extended; begin if A<B then Result:=A else Result:=B; end; function Max(const A,B:extended):extended; begin if A>B then Result:=A else Result:=B; end; function Ceil(const X:extended):Integer; begin Result:=Integer(Trunc(X)); if Frac(X)>0 then Inc(Result); end; var xform:TXFORM; vfRradians,vfCosinus,vfSinus,vfPoint1x,vfPoint1y,vfPoint2x,vfPoint2y,vfPoint3x,vfPoint3y:extended; vfMinx,vfMiny,vfMaxX,vfMaxY:extended; ToBitmapWidth,ToBitmapHeight:Integer; begin Result:=TBitmap.Create; vfRradians:=(2*3.141592653589793238462643383279*Angle)/360; vfCosinus:=cos(vfRradians); vfSinus:=sin(vfRradians); vfPoint1x:=(-FromBitmap.Height*vfSinus); vfPoint1y:=(FromBitmap.Height*vfCosinus); vfPoint2x:=(FromBitmap.Width*vfCosinus-FromBitmap.Height*vfSinus); vfPoint2y:=(FromBitmap.Height*vfCosinus+FromBitmap.Width*vfSinus); vfPoint3x:=(FromBitmap.Width*vfCosinus); vfPoint3y:=(FromBitmap.Width*vfSinus); vfMinx:=Min(0,Min(vfPoint1x,Min(vfPoint2x,vfPoint3x))); vfMiny:=Min(0,Min(vfPoint1y,Min(vfPoint2y,vfPoint3y))); vfMaxX:=Max(vfPoint1x,Max(vfPoint2x,vfPoint3x)); vfMaxY:=Max(vfPoint1y,Max(vfPoint2y,vfPoint3y)); ToBitmapWidth:=Ceil(vfMaxX-vfMinx); ToBitmapHeight:=Ceil(vfMaxY-vfMiny); Result.Width:=ToBitmapWidth; Result.Height:=ToBitmapHeight; xform.eM11:=vfCosinus; xform.eM12:=vfSinus; xform.eM21:=-vfSinus; xform.eM22:=vfCosinus; xform.eDx:=-vfMinx; xform.eDy:=-vfMiny; SetGraphicsMode(Result.Canvas.Handle,GM_ADVANCED); SetWorldTransform(Result.Canvas.Handle,xform); BitBlt(Result.Canvas.Handle,0,0,FromBitmap.Width,FromBitmap.Height,FromBitmap.Canvas.Handle,0,0,SRCCOPY); end;
#3
by H A D G E H O G s
Фигню сморозить. ModifyWorldTransform - это тупо добавочное преобразование/сброс "мирового" пространства.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Как поменять ориентацию в табличном документе сохраняемом в экселе
- Получить табличную часть текущего документа
- v8: Книга покупок (как удалить сч-ф.)
- Мобильное приложение: Ошибка преобразования данных xdto:
- Настройка сетевого сканирования МФУ Ricoh Aficio MP 171
- Объединить одинаковые строки в Дин. списке
- Как настроить HASP License Manager
- Управляемые формы - глюк с выбором значений (v 18.104)
- БП 2.0: "Закрыть" счет по пустому субконто
- Вывести результат запроса в Табличный документ
- v7: права доступа акту сверки
- РИБ. Сменить текущий узел.
- Ресурс Количество с учетом серии в регистре накопления Свободные остатки
- Не обновляется представление ссылки в форме документа
- ActiveDocument Excel Поиск и замена
- Остаток неверно переходит на следующий день
- в отчете СКД не видны контрагенты
- Код региона в ЗУП
- Argox OS-203DT в 1С Розница 2.0
- Как получить записи из первой таблицы которых нет во второй?