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

tromani

Пользователи
  • Постов

    31
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные tromani

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

    procedure JBitmapToBitmap(const AImage: JBitmap; const ResBitmap: TBitmap);
    var
      ImageData: TJavaArray<Integer>;
      BitmapData: TBitmapData;
      Width, Height: Integer;
    begin
      Width := AImage.getWidth;
      Height := AImage.getHeight;
      try
        ImageData := TJavaArray<Integer>.Create(Width * Height);
        ResBitmap.SetSize(Width,Height);
        AImage.getPixels(ImageData, 0, Width, 0, 0, Width, Height);
        if ResBitmap.Map(TMapAccess.maWrite, BitmapData) then
          try
            Move(ImageData.Data^, BitmapData.Data^, Width * Height * SizeOf(Integer));
          finally
            ResBitmap.Unmap(BitmapData);
          end else
            ResBitmap.Clear(TAlphaColorRec.Green);
      except
        ResBitmap.Clear(TAlphaColorRec.Green);
      end;
    end;
        
    function calculateInSampleSize(options:JBitmapFactory_Options; reqWidth, reqHeight:integer):integer;
    var
      nh,nw:integer;
      heightRatio,widthRatio:integer;
    begin
      nh:=options.outHeight;
      nw:=options.outWidth;
      result:=1;
      if (nh> reqHeight) or (nw > reqWidth) then
      begin
        heightRatio:=round( nh / reqHeight);
        widthRatio:= round(nw /reqWidth);
        if heightRatio<widthRatio then
          Result:=heightRatio else
            Result:=widthRatio;
      end;
    end;
    
    var
      cur_bitmap:JBitmap;
      bitmap_option:JBitmapFactory_Options;
      cf_path:string;
    begin
      bitmap_option:=TJBitmapFactory_Options.JavaClass.init;
      bitmap_option.inJustDecodeBounds := true;
      TJBitmapFactory.JavaClass.decodeFile(StringToJString(cf_path),bitmap_option);
      bitmap_option.inSampleSize := calculateInSampleSize(bitmap_option, Round(Image5.Width), Round(Image5.Height));
      bitmap_option.inJustDecodeBounds := false;
      try
        cur_bitmap:=TJBitmapFactory.JavaClass.decodeFile(StringToJString(cf_path),bitmap_option);
      except
        cur_bitmap:=nil;
      end;
      if Assigned(cur_bitmap) then
        JBitmapToBitmap(cur_bitmap,Image5.Bitmap);
    end;

    таким образом все просто шикарно, загрузка мгновенно все норм кроме одного, вместо синего - красный, не знаю как решить

  2. хм... ну очевидно что медленность работы вызвана 

    ABitmapSurfaceResize.StretchFrom(ABitmapSurface,mxW,mxH);

    в любом случае, поменяй код так чтоб эта часть вызывалась только тогда когда надо, в ином случае делай .Assign это решит проблему.

     

    Я конечно не знаю как у вас происходит но меня очень напрягает когда 2-3% скачавших приложение ставят оценку 1 потому что что-то не заработало или они не разобрались как работает

     

     

  3. в общем итоговая процедура получилась у меня вот так, при этом заработало там где до этого не работало

    procedure CheckAndLoadFromStream(FileName:string; const ABitmap : TBitmap);
    var
      MaxImageSize : Integer;
      ABitmapSurface,ABitmapSurfaceResize : TBitmapSurface;
      mxH,mxW:integer;
    begin
      ABitmapSurface:=TBitmapSurface.Create;
      ABitmapSurfaceResize:=TBitmapSurface.Create;
      TBitmapCodecManager.LoadFromFile(FileName,ABitmapSurface);
      MaxImageSize:=TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize);
      if (ABitmapSurface.Height>MaxImageSize) or (ABitmapSurface.Width>MaxImageSize) then
      begin
        if ABitmapSurface.Height>ABitmapSurface.Width then
        begin
          mxH:=MaxImageSize;
          mxW:=Round(mxH/ABitmapSurface.Height*ABitmapSurface.Height);
        end else
          begin
            mxW:=MaxImageSize;
            mxH:=Round(mxW/ABitmapSurface.Width*ABitmapSurface.Height);
          end;
      end else
        begin
          mxW:=ABitmapSurface.Width;
          mxH:=ABitmapSurface.Height;
        end;
      ABitmapSurfaceResize.SetSize(mxW,mxH);
      ABitmapSurfaceResize.StretchFrom(ABitmapSurface,mxW,mxH);
      FreeAndNil(ABitmapSurface);
      ABitmap.SetSize(mxW,mxH);
      ABitmap.Assign(ABitmapSurfaceResize);
      FreeAndNil(ABitmapSurfaceResize);
    end;
  4. В 19.05.2016 в 22:57, Евгений Корепов сказал:

    Я смирился. У меня в приложении с ~20000 пользователями ошибка вылезает у 290 :-( Т.е. это примерно 1.5%. 

    попробуй переставь

    ABitmapSurfaceResize:=TBitmapSurface.Create;

    после 

    ABitmapSurface:=TBitmapSurface.Create;

    и

    после определения максимальных длины и ширины  - сделай ABitmapSurfaceResize.SetSize

    у меня по крайней мере заработало.

     

  5. скажите, кто-нибудь разобрался с проблемой?

    у меня все тоже - 

     ABitmap.Assign(ABitmapSurfaceResize);

    даже ПОСЛЕ преобразования размеров выдает ошибку  Bitmap size too big

    в FMX ужасно раздражает что на корректную работу строчки TBitmap().LoadFromFile(filename) можно потратить больше суток, причем не факт что в новой версии все будет работать стабильно

×
×
  • Создать...