Перейти к содержанию
Fire Monkey от А до Я
  • 0

iOS создать превью (Thumbnail) большой картинки


Slym

Вопрос

как в iOS создать превью (Thumbnail) большой картинки и не занять всю память...
Тестирую на 11Мб jpg, 14К*9К = 126MPx = 500МБ битмап, взято с запасом против 48Мpx камер
Целевое разрешение 120*90
В лоб загрузка и отрисовка превью - дорого по памяти -можно вылететь, особенно в несколько потоков
в андроид есть TJBitmapFactory.JavaClass.decodeFile(Options.inSampleSize) и оно в несколько потоков делает превью
в иос инет тыкает в CGImageSourceCreateThumbnailAtIndex (kCGImageSourceCreateThumbnailWithTransform и kCGImageSourceThumbnailMaxPixelSize ) из ImageIO
заголовков iOSapi.ImageIO - нет, но прикрутил правкой Macapi.ImageIO  - поправил фреймворк на libImageIO = '/System/Library/Frameworks/ImageIO.framework/ImageIO';
но не работает, а отладка на теле недоступна т.к. сборка на удаленном маке.

код сыпет ImgRef = nil, т.е. CGImageSourceCreateThumbnailAtIndex - не отрабатывает, либо заголовки мною криво накручены либо 126MPx не подъемны для iOS

uses
  iOSapi.CocoaTypes, iOSapi.CoreGraphics, Macapi.CoreFoundation,
  iOSapi.ImageIO{переделанный Macapi.ImageIO}, Macapi.Helpers,

class function TPhotoProxy.LoadInThumb(const Filename:string; Surface:TBitmapSurface; const PrefferedSize:TSize):boolean;
var
  Path: CFStringRef;
  Url: CFURLRef;
  ImgSourceRef: CGImageSourceRef;
  ImgRef: CGImageRef;
  Dict: CFDictionaryRef;
  Keys: array [0..10] of Pointer;
  Value: array [0..10] of Pointer;
  IntValue: Cardinal;
begin
  Result := False;
  Path := CFStringCreateWithCString(nil, MarshaledAString(UTF8Encode(Filename)), kCFStringEncodingUTF8);
  try
    Url := CFURLCreateWithFileSystemPath(nil, Path, kCFURLPOSIXPathStyle, False);
    try
      ImgSourceRef := CGImageSourceCreateWithURL(Url, nil);
      if ImgSourceRef = nil then
        raise Exception.Create('ImgSourceRef = nil');
      try
        Keys[0] := CFSTR('kCGImageSourceCreateThumbnailWithTransform');
        Value[0] := kCFBooleanTrue;
        Keys[1] := CFSTR('kCGImageSourceCreateThumbnailFromImageAlways');
        Value[1] := kCFBooleanTrue;
        Keys[2] := CFSTR('kCGImageSourceThumbnailMaxPixelSize');
        if PrefferedSize.cx > PrefferedSize.cy then
          IntValue := Trunc(PrefferedSize.cx)
        else
          IntValue := Trunc(PrefferedSize.cy);
        Value[2] := CFNumberCreate(nil, kCFNumberSInt32Type, @intValue);
        Dict := CFDictionaryCreate(nil, @Keys[0], @Value[0], 3, nil, nil);
        try
          ImgRef := CGImageSourceCreateThumbnailAtIndex(ImgSourceRef, 0, Dict);
          if ImgRef = nil then
            raise Exception.Create('ImgRef = nil');
          try
            Result := ImageToSurface(ImgRef, Surface, MaxInt);
          finally
            CGImageRelease(ImgRef);
          end;
        finally
          CFRelease(Dict);
        end;
      finally
        CFRelease(ImgSourceRef);
      end;
    finally
      CFRelease(Url);
    end;
  finally
    CFRelease(Path);
  end;
end;

к то чем поможет?

Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...