UIImage Сохраняющий образа с именем файла на iPhone

Как я могу сохранить образ (как использование UIImageWriteToSavedPhotosAlbum () метод) с именем файла моего выбора к частной папке / папке var?

12
задан erastusnjuki 15 February 2010 в 04:27
поделиться

2 ответа

Вы можете связаться с буфером обмена с помощью xclip . Этот скрипт python можно использовать для выполнения этой задачи, связавшись с 'dcop' и 'klipper' здесь . Это для KDE, я не знаю, как это было бы сделано под GNOME... Вы также можете сделать это независимо от GNOME/KDE, используя DBUS, хотя я не могу сказать 100% уверенно на этом тоже...

Просто знайте, что для действительно кроссплатформенной работы необходимо учитывать различные GUI, например, в Linux, X является главным интерфейсом управления окнами, и GNOME/KDE находится поверх него.. Я не выделяю другие GUI, такие как CharingBox, WindowMaker назвать только несколько, и что будет много зависящего от платформы кода, а также в сочетании, вы будете иметь дело с Windows буфер обмена, в целом, большой интегрированный код...

Не рассматривали ли вы возможность использования неочищенного API X для поддержки буфера обмена? Возможно, это может быть лучше, как я мог бы представить, GNOME/KDE и т.д. используют X 's API для выполнения работы буфера обмена... если это будет подтверждено, то работа будет вырезана и будет независимой от основных интерфейсов GUI...(Я надеюсь, что это будет так, так как это облегчит жизнь вашему проекту!)

Возможно, используя коммутаторы времени компиляции, для каждой платформы... WIN, KDE, GNOME, MAC или использовать ту, которая уже заранее определена..

Надеюсь, что это поможет, С уважением, Том.

-121--3329713-

Это можно сделать с помощью GDI + ( # include < gdiplus.h > ). Класс Graphics имеет метод RotateTransform . Это позволяет произвольно вращаться. Используйте Image:: RotateFlip () , если нужно повернуть только на 90 градусов, это намного эффективнее.

-121--3126629-

Кенни, у вас был ответ! Для иллюстрации я всегда думаю, что код более полезен.

//I do this in the didFinishPickingImage:(UIImage *)img method

NSData* imageData = UIImageJPEGRepresentation(img, 1.0);


//save to the default 100Apple(Camera Roll) folder.   

[imageData writeToFile:@"/private/var/mobile/Media/DCIM/100APPLE/customImageFilename.jpg" atomically:NO]; 
17
ответ дан 2 December 2019 в 05:40
поделиться

Когда я начал думать о том, как «жениться» на MVVM и RX, первое, что я думал о ObserverCommand:

public class ObservableCommand : ICommand, IObservable<object>
{
    private readonly Subject<object> _subj = new Subject<object>();

    public void Execute(object parameter)
    {
        _subj.OnNext(parameter);
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public IDisposable Subscribe(IObserver<object> observer)
    {
        return _subj.Subscribe(observer);
    }
}

Но потом я подумал, что «стандартный» способ MVVM связывания элементов управления со свойствами ICommand не очень RX 'ish, он нарушает поток событий RX больше касается событий, и прослушивание события Executed routed представляется подходящим. Вот что я придумал:

1) У вас есть поведение CommandRelay, которое вы устанавливаете в корне каждого пользовательского элемента управления, который должен отвечать на команды:

public class CommandRelay : Behavior<FrameworkElement>
{
    private ICommandSink _commandSink;

    protected override void OnAttached()
    {
        base.OnAttached();
        CommandManager.AddExecutedHandler(AssociatedObject, DoExecute);
        CommandManager.AddCanExecuteHandler(AssociatedObject, GetCanExecute);
        AssociatedObject.DataContextChanged 
          += AssociatedObject_DataContextChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        CommandManager.RemoveExecutedHandler(AssociatedObject, DoExecute);
        CommandManager.RemoveCanExecuteHandler(AssociatedObject, GetCanExecute);
        AssociatedObject.DataContextChanged 
          -= AssociatedObject_DataContextChanged;
    }

    private static void GetCanExecute(object sender, 
        CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

    private void DoExecute(object sender, ExecutedRoutedEventArgs e)
    {
        if (_commandSink != null)
            _commandSink.Execute(e);
    }

    void AssociatedObject_DataContextChanged(
       object sender, DependencyPropertyChangedEventArgs e)

    {
        _commandSink = e.NewValue as ICommandSink;
    }
}

public interface ICommandSink
{
    void Execute(ExecutedRoutedEventArgs args);
}

2) ViewModel, обслуживающий контроль за работой пользователей, унаследован от ReactiveViewModel:

    public class ReactiveViewModel : INotifyPropertyChanged, ICommandSink
    {
        internal readonly Subject<ExecutedRoutedEventArgs> Commands;

        public ReactiveViewModel()
        {
            Commands = new Subject<ExecutedRoutedEventArgs>();
        }

...
        public void Execute(ExecutedRoutedEventArgs args)
        {
            args.Handled = true;  // to leave chance to handler 
                                  // to pass the event up
            Commands.OnNext(args);
        }
    }

3) Элементы управления не привязываются к свойствам ICommand, а вместо них используются свойства RoutedCommand:

public static class MyCommands
{
    private static readonly RoutedUICommand _testCommand 
       = new RoutedUICommand();
    public static RoutedUICommand TestCommand 
      { get { return _testCommand; } }
}

И в XAML:

<Button x:Name="btn" Content="Test" Command="ViewModel:MyCommands.TestCommand"/>

В результате, на вашей ViewModel вы можете слушать команды очень RX способом:

    public MyVM() : ReactiveViewModel 
    {
        Commands
            .Where(p => p.Command == MyCommands.TestCommand)
            .Subscribe(DoTestCommand);
        Commands
            .Where(p => p.Command == MyCommands.ChangeCommand)
            .Subscribe(DoChangeCommand);
        Commands.Subscribe(a => Console.WriteLine("command logged"));
    }

Теперь у вас есть сила маршрутизируемых команд (вы можете свободно выбирать обработку команды для любой или даже нескольких ViewModels в иерархии), плюс у вас есть «единый поток» для всех команд, который меньше для RX, чем для отдельных IObservable.

-121--1384702-

Можно попытаться использовать расширения SSE. Например, можно ввести два вектора A (x1, y1, z1) и B (x2, y2, z2):

_m128 A = _mm_set_ps(x1, y1, z1, 0.0f)
_m128 B = _mm_set_ps(x2, y2, z2, 0.0f)

Затем вычислить diff с помощью _mm_sub_ps:

__m128 Diff = _mm_sub_ps(A, B)

Next вычислить sqr diff:

__m128 Sqr = __mm_mul_ps(Diff, Diff)

И, наконец:

__m128 Sum = add_horizontal(Sqr)
__m128 Res = _mm_sqrt_ss(Sum)

Res [0] будет заполнен вашим ответом.

P.S. add_horizontal - это место для оптимизации

-121--2288819-

UIImageWriteToSavedAlbum () используется только для сохранения в ролле фотокамеры. Чтобы сохранить файл в пользовательской папке, необходимо преобразовать файл UIImage в NSData с помощью UIImageJPEGRepresentation () или UIImagePNGRrepresentation () , а затем сохранить NSNSSDDATATATAT

10
ответ дан 2 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: