Я нашел категорию для UIImage в собственных примерах Apple, которая делает то же самое. Вот ссылка: https://developer.apple.com/library/ios/samplecode/sc2273/Listings/AirDropSample_UIImage_Resize_m.html .
Вам просто нужно изменить вызов:
UIGraphicsBeginImageContextWithOptions(newSize, YES, 2.0);
в imageWithImage:scaledToSize:inRect:
с помощью:
UIGraphicsBeginImageContextWithOptions(newSize, NO, 2.0);
, чтобы рассмотреть альфа-канал на изображении.
Наконец-то разобрался !! Всем спасибо за предложения! Я наконец понял, что лучшее решение - передать JSON через Http Post и использовать настраиваемый ModelBinder для преобразования JSON в словарь. Одна вещь, которую я сделал в своем решении, - это объект JsonDictionary, который наследуется от Dictionary, чтобы я мог прикрепить настраиваемый ModelBinder к типу JsonDictionary, и он не вызовет никаких конфликтов в будущем, если я позже использую Dictionary в качестве параметра ActionResult для другое назначение, чем JSON.
Вот последний метод ActionResult:
public ActionResult AddItems([Bind(Include="values")] JsonDictionary values)
{
// do something
}
И вызов jQuery «$ .post»:
$.post("/Controller/AddItems",
{
values: Sys.Serialization.JavaScriptSerializer.serialize(
{
id: 200,
"name": "Chris"
}
)
},
function(data) { },
"json");
Затем необходимо зарегистрировать JsonDictionaryModelBinder, я добавил это в метод Application_Start в Global.asax .cs:
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(JsonDictionary), new JsonDictionaryModelBinder());
}
И, наконец, здесь ' s созданный мной объект JsonDictionaryModelBinder и объект JsonDictionary:
public class JsonDictionary : Dictionary<string, object>
{
public JsonDictionary() { }
public void Add(JsonDictionary jsonDictionary)
{
if (jsonDictionary != null)
{
foreach (var k in jsonDictionary.Keys)
{
this.Add(k, jsonDictionary[k]);
}
}
}
}
public class JsonDictionaryModelBinder : IModelBinder
{
#region IModelBinder Members
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.Model == null) { bindingContext.Model = new JsonDictionary(); }
var model = bindingContext.Model as JsonDictionary;
if (bindingContext.ModelType == typeof(JsonDictionary))
{
// Deserialize each form/querystring item specified in the "includeProperties"
// parameter that was passed to the "UpdateModel" method call
// Check/Add Form Collection
this.addRequestValues(
model,
controllerContext.RequestContext.HttpContext.Request.Form,
controllerContext, bindingContext);
// Check/Add QueryString Collection
this.addRequestValues(
model,
controllerContext.RequestContext.HttpContext.Request.QueryString,
controllerContext, bindingContext);
}
return model;
}
#endregion
private void addRequestValues(JsonDictionary model, NameValueCollection nameValueCollection, ControllerContext controllerContext, ModelBindingContext bindingContext)
{
foreach (string key in nameValueCollection.Keys)
{
if (bindingContext.PropertyFilter(key))
{
var jsonText = nameValueCollection[key];
var newModel = deserializeJson(jsonText);
// Add the new JSON key/value pairs to the Model
model.Add(newModel);
}
}
}
private JsonDictionary deserializeJson(string json)
{
// Must Reference "System.Web.Extensions" in order to use the JavaScriptSerializer
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
return serializer.Deserialize<JsonDictionary>(json);
}
}
Я не думаю, что можно передать словарь из jQuery / Ajax в метод ActionResult через Http Post. Одна вещь, которую я понял, с которой проще всего работать, - это передать объект JSON, а затем проанализировать его в словаре.
Вот модифицированная версия вышеупомянутого вызова "$ .post" из jQuery, который отправляет JSON как псевдо-словарь:
$.post("/Controller/AddItems",
{
values: Sys.Serialization.JavaScriptSerializer.serialize(
{
id: 200,
"name": "Chris"
}
)
},
function(data) { },
"json");
Функция «Sys.Serialization.JavaScriptSerializer.serialize» является методом библиотеки ASP.NET AJAX JavaScript.
Вот модифицированная версия указанного выше метода ActionResult:
public ActionResult AddItems(Dictionary<string, object> values)
{
// Must Reference "System.Web.Extensions" in order to use the JavaScriptSerializer
var json = new System.Web.Script.Serialization.JavaScriptSerializer();
var data = json.Deserialize<Dictionary<string, string>>(routeValues);
// do something
}
Я думаю, что это значительно упрощает модульный тест, передавая JSON вместо использования коллекции форм для отправки / получения коллекции пар ключ / значение. Кроме того, это
Это возможно с использованием подшивок пользовательских моделей или фильтров. За кулисами - вам все равно придется делать это вручную (Request.Form, синтаксический анализ строк, создание словарного тралала), но, по крайней мере, ваш контроллер будет чистым, и код можно будет повторно использовать для других действий.
DefaultModelBinder может привязать ваш POST к массиву или словарю. Например:
для массивов:
public ActionResult AddItems(string[] values)
$.post("/Controller/AddItems", { values: "values[0]=200&values[1]=300" },
function(data) { }, "json");
или:
$.post("/Controller/AddItems", { values: "values=200&values=300" },
function(data) { }, "json");
для словарей:
public ActionResult AddItems(Dictionary<string, object> values)
$.post("/Controller/AddItems", {
values: "values[0].Key=value0&values[0].Value=200&values[1].Key=value1&values[1].Value=300" }, function(data) { }, "json");
ОБНОВЛЕНО:
Если ваши значения находятся во входных данных HTML, тогда в jQuery вы можете сделать что-то вроде этого:
var postData = $('input#id1, input#id2, ..., input#idN").serialize();
// or
var postData = $('input.classOfYourInputs").serialize();
$.post("/Controller/AddItems", { values: postData }, function(data) { }, "json");
ОБНОВЛЕНО:
Также проверьте это: ComputerZen.com Скотта Хансельмана - Формат связи ASP.NET для привязки модели к массивам, спискам, коллекциям, словарям