Problem mit abspeichern von TImage in Bitmaps



  • Ich habe ein Programm geschrieben was den Farbwert und den Radius eines Kreises verringert und in einer BitmapDatei abspeichert.

    Im angegebenen Beispiel wurde mit ansteigendem Iterator "i" der Rotanteil der Farbe jeweils immer verringert, beginnend bei "255", endend bei "0". Desweitern wurde der Radius von "20" auf "0" verringert. das Ganze verläuft über "255" Iterationen. Demzufolge wurden auch 255 Bilder erzeugt. Grün - und BlauAnteil sind beide bei "0"

    Die Radien stimmen in allen Bildern. Nur die Farben (in dem Fall dann Rot) stimmen nicht. Bereits beim 128. Bild ist alles schwarz und beginnt dann direkt danach wieder bei einem Rotanteil von nahezu 255...

    Hier mal der Code:

    Iterator i, Anzahl der Bilder N, Dateiname fn.

    "circles": Informationsfeld über alle Kreise (im Testfall ist das nur einer).
    Positon x,y
    Maximaler Radius rad1, minimaler Radius rad2
    Maximale Farbe col1, minimale Farbe col2

    Anmerkung: Die Funktion "GetVal" ermittelt entsprechend des Fortschritts des Iterators i in Richtung N einen Zwischenwert zwischen zwei Werten (z.B. zwischen maximalem und minimalem Radius)

    int N = StrToInt(Edit16->Text);
    for (int i = 0; i < N; i++)
    {
       AnsiString fn = "";
       if (i < 100)
          fn += "0";
       if (i < 10)
          fn += "0";
       fn += IntToStr(i);
       fn += ".bmp";
    
       Form1->Image1->Canvas->Brush->Color = BackGroundColor;
       Form1->Image1->Canvas->FillRect( Rect(0, 0, w, h) );
       for (int c = 0; c < Ncircles; c++)
       {
          int x = circles[c].x;
          int y = circles[c].y;
          int rad = GetVal(circles[c].rad1, circles[c].rad2, i, N-1);
          int r = GetVal( GetRValue(circles[c].col1), GetRValue(circles[c].col2), i, N-1);
          int g = GetVal( GetGValue(circles[c].col1), GetGValue(circles[c].col2), i, N-1);
          int b = GetVal( GetBValue(circles[c].col1), GetBValue(circles[c].col2), i, N-1);
          TColor cl = (TColor)RGB((short)r, (short)g, (short)b);
          Form1->Image1->Canvas->Pen->Color = cl;
          Form1->Image1->Canvas->Brush->Color = cl;
          Form1->Image1->Canvas->Brush->Style = bsSolid;
          Form1->Image1->Canvas->Ellipse(x - rad, y - rad, x + rad, y + rad);
          Memo1->Lines->Add(fn+" "+IntToStr( GetRValue(cl) )+" "+IntToStr( GetGValue(cl) )+" "+IntToStr( GetBValue(cl) )+" "+IntToStr(rad));
       }
       Form1->Image1->Picture->Bitmap->SaveToFile(fn);
    }
    

    Im Memo1 habe ich mir zur Kontrolle mal die Farbanteile je nach Iteration ausgeben lassen und die sind genauso wie sie sein sollen... nur im erzeugten Bitmap stimmt es nicht.

    Ausgabe des Memos:

    000.bmp 255 0 0 20
    001.bmp 253 0 0 19
    002.bmp 252 0 0 19
    003.bmp 251 0 0 19
    004.bmp 250 0 0 19
    005.bmp 249 0 0 19
    006.bmp 248 0 0 19
    007.bmp 247 0 0 19
    008.bmp 246 0 0 19
    009.bmp 245 0 0 19
    010.bmp 244 0 0 19
    011.bmp 243 0 0 19
    012.bmp 242 0 0 19
    013.bmp 241 0 0 18

    ....
    241.bmp 13 0 0 1
    242.bmp 12 0 0 0
    243.bmp 11 0 0 0
    244.bmp 10 0 0 0
    245.bmp 9 0 0 0
    246.bmp 8 0 0 0
    247.bmp 7 0 0 0
    248.bmp 6 0 0 0
    249.bmp 5 0 0 0
    250.bmp 4 0 0 0
    251.bmp 3 0 0 0
    252.bmp 2 0 0 0
    253.bmp 1 0 0 0
    254.bmp 0 0 0 0

    Wo kann der Fehler liegen, dass bis zum Schluss alle Werte in Ordnung sind, nur eben die Kreise im Bitmap ne falsche Farbe haben?

    schonmal danke 🙂

    gruß Tobi



  • Ich habe gerade einen Versuch mit nur der Farbänderung gemacht und da wurden die Farben in den Bilder korrekt angezeigt/gespeichert, wobei ab einem Farbanteil unter 55 eh alles Schwarz aussieht

    Folgenden Test hab ich verwendet, wobei ich das Image in eine ScrollBox gelegt habe. Das Ergebnis ist ein Farbverlauf.

    int N = 255;
    Image1->Width = 100;
    Image1->Height= 2600;
    Image1->Canvas->Brush->Color = clWhite;
    Image1->Canvas->FillRect( Rect(0, 0, Image1->Width, Image1->Height) );
    for (int i = 0; i < N; i++)
      {
      TColor cl = (TColor)RGB((BYTE)i, (BYTE)0, (BYTE)0);
      Image1->Canvas->Pen->Color = cl;
      Image1->Canvas->Brush->Color = cl;
      Image1->Canvas->Brush->Style = bsSolid;
      Image1->Canvas->Ellipse(10, 10+(i*10), 50, 50+(i*10));
      Image1->Refresh();
      Memo1->Lines->Add(IntToStr( GetRValue(cl) )+" "+IntToStr( GetGValue(cl) )+" "+IntToStr( GetBValue(cl) ));
      }
    Image1->Picture->Bitmap->SaveToFile("test.bmp");
    


  • erstmal vielen Dank für deine Mühe Linnea 🙂

    Form1->Image1->Canvas->Pen->Color = cl;
    Form1->Image1->Canvas->Brush->Color = cl;
    Form1->Image1->Canvas->Brush->Style = bsSolid;
    Form1->Image1->Canvas->Ellipse(x - rad, y - rad, x + rad, y + rad);
    Memo1->Lines->Add(fn+" "+IntToStr( GetRValue(cl) )+" "+IntToStr( GetGValue(cl) )+" "+IntToStr( GetBValue(cl) )+" "+IntToStr(rad));
    

    entscheidend sind diese 5 Zeilen, mit denen ich den erzeugten Farbwert noch einmal in seine Anteile zerlege und im Memo aufliste...

    Ich kann mir einfach nicht erklären wieso in meinem Fall Memo-ausgabe und erzeugtes Bitmap nicht übereinstimmen. Ich hätte ja auch erwaretet, dass es so wie bei dir einwandfrei funktioniert - tut es bei mir leider nicht. Habe noch das

    Image1->Refresh();
    

    hinzugefügt aber das brachte auch keine Verbesserung.

    EDIT:

    Hab jetzt mit dem gleichen Farbwert "cl" in einer zusätzlichen PaintBox einen Farbverlauf aus senkrechten Linien gemacht... problemlos und alles so wie es sein soll....

    Ich versteh einfach nicht wieso das im Bitmap nicht ankommt obwohl es auch auf dem Image (was sichtbar ist) richtig zu erkennen ist, also auch ordnungsgemäß dargestellt wird. Solange tippe ich auf einen Fehler im "SaveToFile" ...



  • Wie sieht bei Deinem Bitmap das Pixelformat aus?
    Ist das pf24bit?

    Gruss
    frank



  • das steht (hab es nicht verändert) auf "pfDevice".

    Hab jetzt mal auf ner PaintBox zeichnen lassen und es danach mit CopyRect in das TImage geholt... bringt aber keine Veränderung.

    Edit: die ganzen Objekte (TImage, TPaintBox) liegen in einer ScrollBox ... vielleicht ist das ja relevant.



  • das glaub ich kaum, da ich auch eine Scrollbox verwendet habe für das Farbverlaufbild. Der Einzelbildversuch war ohne Scrollbox war und beim Speichern stimmten die Farben bei mir bei allen Bildern.

    Lass dir auch mal die Werte von r,g und b mit ausgeben, ich vermute du setzt irgendwie das erste Byte von TColor mit und deshalb kommt es vielleicht zu Fehlern



  • Hallo,

    ich habe zwar nichts zum Thema beizutragen, wollte aber mal Folgendes loswerden:

    Tobi hat hier eine sehr gute Problembeschreibung geliefert! Mit IMHO allem was dazu gehört. Davon kann ich mir echt noch ne Scheibe abschneiden - und viele viele andere User auch! Würde[Edit]n[/Edit] alle Probleme so gut beschrieben, würde des Forum gleich doppelt soviel Spass machen (nicht das es jetzt keinen Spass macht, aber... 😉 )!!!

    👍

    Das wars schon!

    MfG



  • R G und B lass ich doch bereits in dem Memo ausgeben über GetRValue und so...

    Die Werte waren auch alle in Ordnung.

    danke Kolumbus, hab mir auch extra Mühe gegeben da ich ja schließlich derjenige bin, der an einer Lösung interessiert ist 🙂
    Offensichtlich wurde das Problem auch von allen verstanden. 🙂



  • Problem gelöst. Hab das Image jetzt nicht jedesmal neu mit FillRect gefüllt, sondern vorher den background abgespeichert und diese BackgroundDatei jedes mal neu geladen mit LoadFromFile... und schon klappts. Ist zwar irgendwie blöd und ich bemüh mich auch den eigentlichen Fehler zu finden (ich nehme an BitmapParameter sind schuld) aber zur Funktion langt das erstmal.

    danke euch für eure Mühe 🙂



  • *SchaufelHolUndThreadAusgrab*

    Meine Güte,

    ich habe, alles zusammen genommen, bestimmt 8Stunden gesucht, warum ich um einige Bitmaps in TImages keinen roten Rahmen zeichen kann...

    DerAltenburger schrieb:

    Wie sieht bei Deinem Bitmap das Pixelformat aus? Ist das pf24bit?

    ->PixelFormat ist das Stichwort 🙄

    Den Göttern sei Dank, gibt es die Formsuche 👍

    MfG


Anmelden zum Antworten