2013-09-02 4 views
1

Этот вопрос идет за мной почти целый год, и я хочу убить его ради меня и ради всего.AS3: Как окончательно сгладить растровое изображение, загруженное с внешнего сервера.

Я работаю над некоторыми рекламными баннерами, которые нужно загружать изображениями с сайта клиента для отображения. Когда я попытался сделать это с помощью AS2, я узнал, что AS2 не позволяет вам это делать. Это ошибка на языке. Существуют способы обхода изображений на локальном сервере, но изображения, загруженные из них, не могут делиться их BitmapData, поэтому эти обходные пути не работают. Я закончил капитуляцию примерно через два месяца, ударив головой о стол и проклиная Макромедиа.

Теперь мы говорим о переходе на AS3 (наконец), и я очень взволнован. Или я был очень взволнован, пока не начал делать некоторые тесты качества изображения и обнаружил, что здесь очень мало изменений качества изображения. Это повторение моих испытаний с AS2: все отлично загружается в IDE, я все взволнован, я перемещаю swfs на тестовый сервер, чтобы запускать их в Интернете, а POOF - jaggies. Джагги повсюду.

Я прочитал ряд решений в Интернете, ни одна из которых не работает. Они включают в себя:

  • Настройка target.content.smoothing на "true". Отлично работает в среде IDE. Все улучшения исчезают в браузере.

  • Установка target.scaleX = target.scaleY до 1.01. Он просто разбивает swf.

  • Добавление «нового LoaderContext (true)» к моим параметрам для команды load. Ничего не делает.

  • Установка target.content.pixelSnapping на "always". Выглядит отлично в среде IDE, а не в браузере.

  • Установка файла crossdomain.xml. Изображения появляются - они загружаются, даже если они неровно, поэтому на сервере клиента должен быть установлен файл crossdomain, верно?

Итак, теперь я просто застрял и сокрушен. Может ли кто-нибудь дать представление о моем коде и почему это может быть не так красиво, как должно быть? Вот клиент безопасного варианта быстрой демонстрации я решения (только URL изображения были удалены, все остальное, как сейчас):

import flash.events.Event; 

function completeHandler(e:Event) { 
    e.target.content.pixelSnapping = "always"; 
    e.target.content.smoothing = true; 
} 

var imgurl:String = "CLIENT'S IMAGE URL HERE"; 

var imageLoader01:Loader = new Loader(); 
var image01:URLRequest = new URLRequest(imgurl); 
imageLoader01.load(image01); 
imageLoader01.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); 
addChild(imageLoader01); 
imageLoader01.x = 2; 
imageLoader01.y = 0; 
imageLoader01.scaleX = imageLoader01.scaleY = .6; 

var imageLoader02:Loader = new Loader(); 
var image02:URLRequest = new URLRequest(imgurl); 
imageLoader02.load(image02); 
imageLoader02.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); 
addChild(imageLoader02); 
imageLoader02.x = 100; 
imageLoader02.y = 80; 
imageLoader02.scaleX = imageLoader02.scaleY = .308; 

var imageLoader03:Loader = new Loader(); 
var image03:URLRequest = new URLRequest(imgurl); 
imageLoader03.load(image03); 
imageLoader03.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); 
addChild(imageLoader03); 
imageLoader03.x = 200; 
imageLoader03.y = 180; 
imageLoader03.scaleX = imageLoader03.scaleY = .152; 

var bannerLegend:legend = new legend(); 
addChild(bannerLegend); 

Большого спасибо заранее. Любая помощь будет очень оценена.

Update: Вот HTML-код для вставки:

<div id="swf_mr_sc_wt_si"></div> 

<script type="text/javascript"> 
<!-- 
var swfurl = "http://DOMAIN_WITHELD_SORRY/static/AS3.swf?m=DEFAULT&t=" + (new Date().getTime()); 
swfobject.embedSWF(swfurl, "swf_mr_sc_wt_si", 300, 250, "8.0.0", ""); 
// --> 
</script> 

<p> 

Надеется, что это помогает.

Дальнейшее обновление: Мы не указаны в файле crossdomain.xml. Но мы все равно можем загружать зубчатые изображения. И эти изображения, загруженные в один и тот же swf, запускаемый в среде IDE, являются гладкими. Я думаю, что мне не хватает понимания какого-либо апокрифического знания здесь, потому что все, что я читаю, указывает на то, что я могу это сделать. Это ОЧЕНЬ смущает.

+0

Проверьте свою версию FP, по крайней мере, проверьте на другом компьютере, зайдите в другой браузер (IE vs FF vs Chrome, возможно, против Opera или других браузеров). Все это повсюду? Кроме того, что такое «jaggies»? Лестницы в линиях? Нет сглаживания? Проверьте также, если 'stage.quality'' 'высокий '', возможно, есть автоматическое значение, которое опускается по некоторым параметрам. – Vesper

+0

Спасибо, Венер! «Ягги», я не имел никакого сглаживания. Все правильно сглажено в среде IDE, но в браузере? Ничего. Я тестировал его в Chrome, Firefox и IE9. На данный момент у меня нет доступа к другому компьютеру, но у моего Игрока 11.8.800.129. Если было переназначено заданное значение, было ли оно переназначено только в браузере, а не в среде IDE? – StormShadow

+0

Да, ему может быть присвоено другое значение в FP браузера, чем в FP отладчика. – Vesper

ответ

3

Это потому, что изображение, которое вы загружаете, находится в другом домене, а этот домен crossdomain.xml не содержит домена, на котором находится .swf, в основном предоставляя.swf «разрешение» для доступа к данным пикселя изображения (да, просто включение сглаживания изображения, загруженного из другого домена, требует такой же безопасности, как при чтении данных пикселя с использованием BitmapData.draw(), что немного любопытно). При запуске в локальной изолированной среде безопасности ограничения более слабы, поэтому он работает из среды IDE.

Даже если ваш домен были среди утвержденных доменов в crossdomain.xml вам может понадобиться, чтобы сообщить Flash Player, чтобы проверить файл политики, отправив в new LoaderContext(true) в качестве второго аргумента Loader.load() при загрузке изображения.

Редактировать: Первоначально предполагалось, что использование loadBytes() будет обходным путем, но, оказывается, это не так. Я удалил этот пример кода

+1

Это очень важно в списке самых глупых вещей, которые я слышал от языка программирования. Но он проверяет, этот код отлично работает и не запускает любые нарушения безопасности изолированной программной среды, в то время как другая делает это. – evilpenguin

+0

Благодарим вас так много за этот пример. Есть только одно: изображение в вашем примере происходит с сервера с этим параметром в файле crossdomain.xml: Серверы, с которыми я должен работать, не разрешают все домены. Есть ли обходной путь, когда файл crossdomain не включает вас? Или я здесь привинчен? Благодарю. – StormShadow

+1

Дох! Да, вы совершенно правы, пример, который я использовал, имел наименее ограничительный кроссдомен. Выключает loadBytes(), в конце концов, не является решением, что имеет смысл. Извините за то, что вы надеетесь :-) – Strille

Смежные вопросы