Перейти к содержанию
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. попробуй переставь ABitmapSurfaceResize:=TBitmapSurface.Create; после ABitmapSurface:=TBitmapSurface.Create; и после определения максимальных длины и ширины - сделай ABitmapSurfaceResize.SetSize у меня по крайней мере заработало.
  5. понял... ну тут единственный тогда выход что мне видится переписывать с ХЕ6 TImage и TBitmap, там оно работало, у меня глюк появился с переходом на ХЕ8-ХЕ10
  6. скажите, кто-нибудь разобрался с проблемой? у меня все тоже - ABitmap.Assign(ABitmapSurfaceResize); даже ПОСЛЕ преобразования размеров выдает ошибку Bitmap size too big в FMX ужасно раздражает что на корректную работу строчки TBitmap().LoadFromFile(filename) можно потратить больше суток, причем не факт что в новой версии все будет работать стабильно
×
×
  • Создать...