TBitmap.Assign ist zu langsam, gibt es Alternativen?

    TBitmap.Assign ist zu langsam, gibt es Alternativen?

    Hallo,

    Das TBitmap.assign(...) einer 2480 * 3508 Pixel großen Bitmap (A4 in 300 dpi) dauert auf einem großen Windows PC schon gefühlt 1..2 Sekunden, auf einem Android Device 5 mal länger, für den Anwender unakzeptabel!

    Gibt es schnellere Möglichkeiten Bitmaps von einer zur anderen zu kopieren?
    Ich muss schon im Speicher vorhandene Bitmaps laden, etwas draufzeichnen und wieder speichern.

    Ciao
    Stefan
    Naja, vielleicht mit Tricks, könntest ja versuchen das Bild schon vorher zu laden? Oder ein üblicher "Wartescreen" als Userrückmeldung. Ab einem gewissen Punkt dauert es nun mal, je nachdem was man für Rechentechnik hat.

    Grad mal getestet mit IrfanView dauert es ein 4608x2592 jpg ca. 0,75sek gefühlt zu laden von einer SSD. Mal so als Vergleich. Ist nicht der allerschnellste Rechner mehr ;)
    ~~~~~ °;-< ~~~~~
    "nicht der allerschnellste Rechner" ist immer noch 10 mal schneller als ein Handy mit Android !

    Assign ist scheinbar in Firemonkey nicht sauber implementiert, kommt eine andere Anwendung über meine und dann meine Anwendung wieder in den Vordergrund, dann sind Bildteile verschwunden!

    Wird direkt alles kopiert

    Quellcode

    1. ​dest.Canvas.DrawBitmap(src, Rectf(0, 0, src.Width - 1, src.Height - 1),
    2. Rectf(0, 0, dest.Width - 1, dest.Height - 1), 100);


    ist noch alles da wenn das Programm aus dem Hintergrund wieder in den Vordergrund kommt!

    Ciao
    Stefan
    Hmm, naja auf Android Smartphone ... wie viel Pixel hat das denn, muss es denn die volle Auflösung sein? Umrechnen muss das kleine Ding doch eh das Bild für die Anzeige, vielleicht lädst du einfach eine Art Thumbnail für die Anzeige? Jetzt nur so als Idee von mir die mir noch spontan einfällt.
    ~~~~~ °;-< ~~~~~
    Vorab: Ich habe von Berlin nur die Starter, kann das also nicht verifizieren.
    Aber in XE3 (VCL) ist es so, dass das TBitmap eigentlich so gut wie gar keine Daten enthält. Das eigentliche Bild liegt in TBitmap.Image, welches ein Objekt vom Typ TBitmapImage ist. Das gibt es in FMX auch, also vermute ich mal, dass es da genauso ist. Beim Assign wird nichts weiter gemacht (solange es von TBitmap nach TBitmap ist, sonst ist es komplizierter), als den internen Pointer auf das neue Bild zu setzen. Wenn du den Quellcode hast, schau mal in die FMX.Graphics.pas, wie das geregelt ist.
    Das bedeutet aber, dass das eigentliche "Kopieren" des Bildes so ziemlich das effizienteste ist, was es gibt und in wenigen Prozessorzyklen (Referenzmanagement) abgehandelt sein dürfte.
    Das, was lange dauert, ist das Neuzeichnen des bereits kopierten Bildes. Wie das bei dir realisiert ist, hängt natürlich von der verwendeten Komponente ab, da kann ich gar nichts zu sagen. Nur: Zeichnen großer Bilder dauert einfach ziemlich lang. Und es gibt eigentlich nur eine Möglichkeit, das zu beschleunigen: Direkt mit dem Graphikkartentreiber reden. Wenn die nativen Betriebssystemroutinen dafür verwendet werden, hast du nicht viel Chancen auf Optimierung. Deswegen gibt es ja Graphik-Frameworks (OpenGL, DirectX, was auch immer, da habe ich nicht viel Ahnung), die diese Low-Level-Kommunikation vereinfachen.
    Master of the EDH ;)