ImageCache

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Ich habe Blaze seinen Vorschlag so halb umgesetzt, also eher auf eine Primitivere Art und weiße, funktioniert aber. Könnt ihr mir zu der Klasse Verbesserungsvorschläge geben?


    C#-Quellcode

    1. public class ImageCache
    2. {
    3. public ImageCache()
    4. {
    5. ImageCacheLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DisplayUtilize Cache");
    6. if (Directory.Exists(ImageCacheLocation) == false)
    7. {
    8. Directory.CreateDirectory(ImageCacheLocation);
    9. }
    10. }
    11. public string ImageCacheLocation { set; get; }
    12. private List<string> CacheFiles = new List<string>();
    13. private int InternCount = 0;
    14. public void AddToCache(Bitmap bmp)
    15. {
    16. InternCount++;
    17. Bitmap bitmap = (Bitmap)bmp.Clone();
    18. bitmap.Save(Path.Combine(ImageCacheLocation, "cache" + InternCount.ToString()+".png"), System.Drawing.Imaging.ImageFormat.Png);
    19. CacheFiles.Add(Path.Combine(ImageCacheLocation, "cache" + InternCount.ToString() + ".png"));
    20. bitmap.Dispose();
    21. }
    22. public void DisposeCache()
    23. {
    24. InternCount = 0;
    25. Thread disposeCache = new Thread(removeCache);
    26. disposeCache.Start();
    27. }
    28. public void Dispose()
    29. {
    30. Thread disposeCache = new Thread(removeCache);
    31. disposeCache.Start();
    32. }
    33. private void removeCache()
    34. {
    35. string[] arrCache = Directory.GetFiles(ImageCacheLocation, "*.png");
    36. for (int i = 0; i <= arrCache.Length - 1; i++)
    37. {
    38. try
    39. {
    40. File.Delete(arrCache[i]);
    41. }
    42. catch
    43. {
    44. }
    45. }
    46. }
    47. public Bitmap Undo()
    48. {
    49. if (CacheFiles.Count > 1)
    50. {
    51. CacheFiles.Remove(CacheFiles[CacheFiles.Count - 1]);
    52. return (Bitmap)Bitmap.FromFile(CacheFiles[CacheFiles.Count - 1]);
    53. }
    54. else
    55. {
    56. return (Bitmap)Bitmap.FromFile(CacheFiles[CacheFiles.Count - 1]);
    57. }
    58. }



    Danke:)
    Mal als VB.Net Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class ImageCache
    2. Public Sub New()
    3. ImageCacheLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DisplayUtilize Cache")
    4. If Directory.Exists(ImageCacheLocation) = False Then
    5. Directory.CreateDirectory(ImageCacheLocation)
    6. End If
    7. End Sub
    8. Public Property ImageCacheLocation() As String
    9. Get
    10. Return m_ImageCacheLocation
    11. End Get
    12. Set
    13. m_ImageCacheLocation = Value
    14. End Set
    15. End Property
    16. Private m_ImageCacheLocation As String
    17. Private CacheFiles As New List(Of String)()
    18. Private InternCount As Integer = 0
    19. Public Sub AddToCache(bmp As Bitmap)
    20. InternCount += 1
    21. Dim bitmap As Bitmap = DirectCast(bmp.Clone(), Bitmap)
    22. bitmap.Save(Path.Combine(ImageCacheLocation, "cache" & InternCount.ToString() & ".png"), System.Drawing.Imaging.ImageFormat.Png)
    23. CacheFiles.Add(Path.Combine(ImageCacheLocation, "cache" & InternCount.ToString() & ".png"))
    24. bitmap.Dispose()
    25. End Sub
    26. Public Sub DisposeCache()
    27. InternCount = 0
    28. Dim disposeCache__1 As New Thread(AddressOf removeCache)
    29. disposeCache__1.Start()
    30. End Sub
    31. Public Sub Dispose()
    32. Dim disposeCache As New Thread(AddressOf removeCache)
    33. disposeCache.Start()
    34. End Sub
    35. Private Sub removeCache()
    36. Dim arrCache As String() = Directory.GetFiles(ImageCacheLocation, "*.png")
    37. For i As Integer = 0 To arrCache.Length - 1
    38. Try
    39. File.Delete(arrCache(i))
    40. Catch
    41. End Try
    42. Next
    43. End Sub
    44. Public Function Undo() As Bitmap
    45. If CacheFiles.Count > 1 Then
    46. CacheFiles.Remove(CacheFiles(CacheFiles.Count - 1))
    47. Return DirectCast(Bitmap.FromFile(CacheFiles(CacheFiles.Count - 1)), Bitmap)
    48. Else
    49. Return DirectCast(Bitmap.FromFile(CacheFiles(CacheFiles.Count - 1)), Bitmap)
    50. End If
    51. End Function
    52. End Class


    Btw. fehlt dir in Line 65 (bzw. 66) ein '}'.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Achso :D
    Jetzt fehlt dir im Zitat ein ' ;)

    Aber ansonsten ganz gut...
    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Wofür ist der Cache? Was wird da rein gepackt? Woher kommen die Bilder? Wie viele sind es? Wie ist die durchschnittliche Größe? Wie oft wird drauf zugegriffen? Was ist der Vorschlag von Blaze gewesen? Und was soll das alles? ;)

    Das Errorhandling beim removeCache-void ist ja mal suboptimal. Du solltest in der Dokumentation schauen, welche Exceptions dort auftreten können, und sie entsprechend abfangen/behandeln/re-throwen.
    msdn.microsoft.com/en-us/library/system.io.file.delete.aspx

    Außerdem fehlt das Errorhandling an anderen Stellen komplett (Zeilen 8, 20, 21, 59, 63). Dass es dort 'fehlt' ist nicht schlimm, du solltest es dann wenigstens (mit der XML-Dokumentation?) dokumentieren und das Handling eine Ebene höher machen, falls du das nicht schon gemacht hast. (Natürlich nicht mit catch{}) ;)
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nikeee13“ ()

    nikeee13 schrieb:

    Wofür ist der Cache? Was wird da rein gepackt? Woher kommen die Bilder? Wie viele sind es? Wie ist die durchschnittliche Größe? Wie oft wird drauf zugegriffen? Was ist der Vorschlag von Blaze gewesen? Und was soll das alles? ;)


    •Lediglich um Undo zu verwalten, da die Bilder zu groß sein können um im RAM gespeichert zu werden
    •Bitmaps
    •Von einer PictureBox auf der Filter angewendet werden, oder gezeichnet wird
    •AddToCache wird bei jeder größeren Bildänderung aufgerufen, ein Linie über 600 Pixel erzeugt etwa 30 Cachefiles
    •Kommt ganz drauf an, meistens nur in KB größe, kann aber auch sehr schnell groß werden, und da läuft der Speicher über. (Ausprobiert -.-")
    •Jedes mal wenn auf Redo geklickt wird,oder was meinst du?

    [VB 2010] Bildbearbeitung Das war mir aber ein bischen zu Kompliziert ;o


    Und was soll das alles? ;)


    Genau für sowas:

    Das Errorhandling beim removeCache-void ist ja mal suboptimal. Du solltest in der Dokumentation schauen, welche Exceptions dort auftreten können und sie entsprechend abfangen/behandeln/re-throwen.
    msdn.microsoft.com/en-us/library/…ile.delete.aspx

    Außerdem fehlt das Errorhandling an anderen Stellen komplett (Zeilen 8, 20, 21, 59, 63). Dass es dort 'fehlt' ist nicht schlimm, du solltest es dann wenigstens (mit der XML-Dokumentation) dokumentieren und das Handling eine Ebene höher machen, falls du das nicht schon gemacht hast. (Natürlich nicht mit }catch{}) ;)



    Danke dir dafür:)
    Im anderen Thread ist die Rede von einer Queue. Ich hätte an der Stelle lieber auf die vorwärts-Funktion verzichtet und etwas Stack-artiges verwendet. Bei einer Änderung einfach was pushen und beim rückgängig-machen poppen. Das sollte einfacher sein.
    Bleibt aber dir überlassen. ;)

    Beziehend auf den Steam-Chat eben:
    List<string>? Wenn du eine Queue machen willst, würde ich in der Klasse intern eine Queue<string> verwenden. Das macht das bestimmt übersichtlicher. Es gibt übrigens auch Stack<T>. (Jeweils generisch und nicht-generisch) ;)
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nikeee13“ ()

    Zur Verallgemeinerung würde ich ggf. noch das Format vorgeben:

    Quellcode

    1. public void AddToCache(Bitmap bmp, System.Drawing.Imaging.ImageFormat fmt)
    2. {}
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!