Bitmap hochauflösend verkleinern



  • Ganz meine Meinung. Wie ich schon sagte, an die Qualität der "Verkleinerungsfunktionen" von Grafikprogrammen wie Photoshop, Paintshop Pro usw. kommst du mit einem selbstgebauten Programm buchstäblich "nie im Leben" ran.



  • Huch, mit den Programmen geht das bereits? Eins davon hat doch jeder Grafiker. Natürlich nicht Paint, das wüßte sogar ich - denk ich zumindest. Ein Poserspezialist ist mal an 20 px hohen Button gescheitert. Wenn das Thema nicht schon öfter angestanden hätte, würd ich jetzt sagen, ich war vorschnell. Aber scheinbar ist es wirklich nicht so leicht, eine gute und interessierte Mannschaft zusammen zu bekommen. Die beklagen sich alle lieber, daß die Hersteller immer lascheres bringen - zocken aber konsequent weiter.

    Ole, mein Builder soll nützlicheres kreieren als das sechseckige Rad nach jahrteusenden neu zu erfinden. :p Dank euch sehr für eure Hilfe. Auf jeden Fall hat es Erfahrung gebracht.

    Mal seh'n, welche unnötige Frage mir als nächstes einfällt. 😃
    Gruß
    Omega-X



  • Was heißt "bereits", Photoshop ist schon ziemlich geil, ich kenne nix besseres.



  • Huch, mit den Programmen geht das bereits? Eins davon hat doch jeder Grafiker. Natürlich nicht Paint, das wüßte sogar ich - denk ich zumindest.

    Eine Datei in Paint öffnen -> [Menü]Bild->Strecken/Zerren... 😉



  • Also hab ich mal Pause gemacht mit Knobeln und subjektiven Beobachtungen und ein Testbild genau auf 50% verkleinert. Von Paint wußte ich es bereits, von meinem Tool sah ich es jetzt. Aus 26 Px wurden genau 13, also keinerlei Gewinn. Für diesen Zweck haben wir etliche gute Möglichkeiten incl. der diversen Filter, die die Resampel-Komponente zT. auch integriert hat.

    Wenn mein Screen 32 cm breit ist, sollte ich rein theoretisch unter 12800 schwarzen px gerade noch ein einzelnes weißes erkennen können. 800 ist also noch grob, aber angemessen für gute Performance. Da dürfen dann aber auch ein paar Leckerbissen für's Auge dabei sein, die einer Auflösungen 1 oder 2 Stufen höher entsprechen.

    Wenn zB. PSP usw. genau das kann, schäm ich mich für unsere Grafiker, denn sie wissen es nicht mal. Wenn nicht, muß ich weitersuchen.

    Wird allerdings nicht leicht, denn die Beispiele zum Reinfinden sind hyperrar und... von Borland. 🙄 Kann mich des Eindrucks nict erwehren, daß die den Ball absichtlich flach halten, das aber in aufgedunsener Sprache kaschieren. Lassen die mich doch das enum DrawTool voll durchziehen, nur um am Ende zu sagen, daß das aber nur bei 4 Zeichentools stabil läuft. Und tatsächlich durfte ich meinen Code dann völlig anders aufbauen, das Zeug war instabil und ungenießbar. So nach dem Kalauer- und Spielereiprinzip kommt es mir immer wieder vor.

    - Nach der Totalernüchterumg um "/page" im RichEdit hatte ich mich dann jahrelang um ganz andere Sachen gekümmert. Selbst der referierende RichEdit-Spezialist in den Borland-Foren konnte nur Fehlermeldungen ernten. Also sogar abgeriegelt, die Geschichte nach dem Prinzip des einzelnen Feldes, das das gesamte Schachbrett kontrolliert...



  • Hab mal die Routine zusammengepfrimelt. Wenn ich den Aktiosbutton klick, bekomm ich die Meldung aus dem Code. Das Bild im Ziel ist zur linken senkrechten Hälfte ein Graustufenwechsel in breiter Querbalkenform. Die rechte senkrechte Bildhälfte enthält das korrekte Teilbild gem der Größenänderung. Hier hilft kein Schrauben (jedenfalls meins nicht). Ich hab einen grundsätzlichen Fehler drin, den ich nicht erkennen kann. Erst wenn das gelungen ist, kann ich mich der eigentlichen Aufgabe widmen...

    ...falls ihr nicht weiterhin über meinen Kopf hinweg entscheidet, daß dies eine unwürdige Übung sei. Tut mir leid, ihr habt alle definiv Unrecht: "Hallo World!" war die erste völlig unnötige Übung, die wohl jeder absolviert hat. "Mit den PC kann man Probleme lösen, die man ohne ihn gar nicht hätte!"

    Also bitte! Haltet einen User, der zur Runde stößt, um zu üben, um was zu lernen, als allererstes mal für erwachsen! Bitte, es ist unerläßlich notwendig, andernfalls existiert dieses Board gar nicht! Genauso wie die 3 anderen Boards, in denen ich überhaupt kein Echo auf diese Frage bekam. Dabei leben zumindest in einem von ihnen Kenner und API-Kenner von Feinsten, ich hatte die großen, staunenden Augen, als ich deren Werke sah. Hier fühlte ich mich anfangs allerdings spontan zuhause.

    void __fastcall TResa::ButtonEnter(TObject *Sender)
    {
     // 2 TEdit stellten via OnExit proportionale Koordinaten ein.
     // Ziel ist ein TImage, welches das veränderte Bild aufnimmt.
     Ziel->Width = StrToInt(EditX->Text);
     Ziel->Height = StrToInt(EditY->Text);
    
     // Eine Speichergrafik übernimmt das Bild,
     // nachdem es via Open-Code im TImage Start geöffnet wurde.
     Graphics::TBitmap* SrcBmp = new Graphics::TBitmap;
     SrcBmp->Width = Start->Width;
     SrcBmp->Height = Start->Height;
     SrcBmp->Assign(Start->Picture->Graphic);
    
     // Speichergrafik übernimmt, um völlig separat arbeiten zu können.
     Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
     // Zeichnung direkt in das BitMap-Objekt ausgeben.
     Byte *ptr;
     try
     {
      pBitmap->Width = SrcBmp->Width;
      pBitmap->Height = SrcBmp->Height;
      pBitmap->Assign(Start->Picture->Graphic);
      for (int y = 0; y <= pBitmap->Height; y++)
      {
       ptr = (Byte *)pBitmap->ScanLine[y];
       for (int x = 0; x <= pBitmap->Width; x++)
        ptr[x] = (Byte)y;
       }
      pBitmap->Canvas->Draw(0,0,pBitmap);
      }
      catch (...) 
      { 
       ShowMessage("Bitmap konnte nicht geladen oder verändert werden");
      } 
     delete SrcBmp;
     SrcBmp = NULL;
    
     // eine weitere Speichergrafik stretcht das bearbeitete Bild
     // in seinen Clientbereich und übergibt an das TImage Ziel.
     Graphics::TBitmap* DestBmp = new Graphics::TBitmap;
     DestBmp->Width = Ziel->Width;
     DestBmp->Height = Ziel->Height;
     RECT DestRect = Rect(0, 0, Ziel->Width, Ziel->Height);
     DestBmp->Canvas->StretchDraw(DestRect, pBitmap);
     Ziel->Picture->Assign(DestBmp);
     delete pBitmap;
     pBitmap = NULL;
    
     // Nur für die Testphase, übernimmt später eine Save-Routine.
     Ziel->Picture->SaveToFile("DestBmp.BMP");
     delete DestBmp;
     DestBmp = NULL;
    }
    

    Kann jemand den Fehler erkennen?



  • Original erstellt von <Omega-X>:
    **
    ...falls ihr nicht weiterhin über meinen Kopf hinweg entscheidet, daß dies eine unwürdige Übung sei. Tut mir leid, ihr habt alle definiv Unrecht: "Hallo World!" war die erste völlig unnötige Übung, die wohl jeder absolviert hat. "Mit den PC kann man Probleme lösen, die man ohne ihn gar nicht hätte!"
    **

    Ich bitte dich! Keiner hat gesagt, dass dich das nicht weiterbringt! Ich habe selbst in Java ein Programm programmiert, mit dem man Bilder sogar auf 4 verschiedene Arten vergrößern und verkleinern kann. Das kann durchaus spannend sein und auch sehr anspruchsvoll. Ich suche immernoch nach einer Methode, das Ergebnis weiter zu verbessern.



  • Erst fand ich es richtig toll, daß man sich Gedanken gemacht hat. Ich geb ja auch am liebsten Hilfe, die auch wirklich nützt. Aber dem Passionisten, was immer dessen Passion sein mag, nicht dem Kommerz.

    Notepad hat einfach nur genervt, Freeware wurde gecheckt, nicht glücklich, der eigene gebaut. Ein Mitstreiter hat ihn jetzt auch, er will nichts anderes mehr.
    HTML mit kommerziellen Tools? Lieber schrieb ich rein nur im eigenen Notepad, bis ich Weaverslave entdeckte. Es wird nur selten so sein, aber Freie Kreationen können durchaus mehr Spaß machen und nützlicher sein als die teuersten und oft für den Hausgebrauch nutzlos überfrachteten Kommerztools.

    Na ja, und jetzt hab ich einen klitzekleinen Bedarf, aber wie üblich da, wo die Hilfe aufhört. Das mit den Sternen + viel zu weit kennt man ja. 🙂 Kann Speicherformat nützen? Das wort steht nur ein einziges mal in der Hilfe, bei TBitmap::PixelFormat. "Mit PixelFormat können Sie das interne Bild des Bitmaps auf ein bestimmtes Speicherformat oder eine bestimmte Farbtiefe setzen..."

    Na ist doch schön. Es gibt also Speicherformate, aber nur der Tiegel unter dem Regenbogen weiß, was sie beinhalten. Ähnlich kurzgeschlossen sind auch ScanLine usw. Ich hab nur ein Beispiel, aber der Weg für den Algor gelingt nicht. Was kann ich tun außer Fragen und dabei hoffen? Na ja, und nachdem geklärt ist, wofür ich es brauchen möchte, scheint das Thema nicht mehr zu existieren. Ist doch klar, daß ich estwa trüpselich dasteh.

    Das einzige, was ich noch konnte, war die Fehlermeldung rausbringen. Beim Probieren hatte ich einmal die Zuweisung gewechselt, aber vergessen, dann auch für Width und Height die Zuweisung zu ändern.

    So, jetzt könnte ich zwar das Bild heller und dunkler machen, dafür hatte ich mal eine Routine für ein Maltool geschrieben. Aber die Aufgabe hat ja nichts mit TColor oder so zu tun. Sie hat mit etwas zu tun, das ich nicht kenne...



  • Oh Mann, und du wirfst anderen "aufgedunsene Sprache" vor!? 😉



  • Na klar. In anderen Nasen bohren tut der eigenen nicht weh - obwohl die es am meisten verdient hätte. 😃



  • Darf das wahr sein? Find ich so ganz nebenbei wieder mal eine Aufgabenstellung, die nur lizenzierten vorbehalten ist? Niemals soll man beim Programmieren den Horizont der Möglichkeiten sehen können. Aber sogar an mehreren Stellen an diesen Punkt gehen können?... Geahnt hatte ich diesen Ausgang bereits, als ich das 21-Tage-Buch aufgearbeitet hab. Aber so total banal und nahe...



  • Alter, Omega, drück dich mal etwas klarer aus.



  • Kannst du bitte nochmal sagen, wo genau gerade dein Problem ist? Du willst immernoch ein Bild verkleinern, oder? Welchen Algorithmus nutzt dazu du eigentlich bzw. wie gehst du dabei vor? Auf welcher Datenstruktur arbeitest du?

    Wenn du immernoch auf irgendeiner vorgefertigten Datenstruktur arbeitest, die du in irgendeiner Doku gefunden hast:

    Vergiß es! Nimm Arrays.



  • - Wenn wir noch ein paar gute Grafiker gewinnen wollen, müssen wir gute Grafik vorzeigen können. Klingt sicher pervers, ist aber völlig klar. Also ist der olle Omega brutal und versucht das notwendige, auch wenn er weder Talent noch das richtige Werkzeug hat. Denn Aufgeben gilt nicht, dafür ist die Story zu ultimativ, die Crew zu gut. -

    Ja, ich möchte immer noch Bitmaps verkleinern. Aber so, als wäre die Screenauflösung ca. 2 Stufen höher gestellt. Also Bitmapverkleinerung bei gleichzeitiger Pixelverkleinerung.

    Bisher hab ich nur den möglichen Ansatz. Start-Image läd das Bild. Eine SpeicherBitmap übernimmt es und soll es incl. der Pixel verkleinern. Ziel-Image zeigt das Ergebnis, von da aus wird gespeichert.

    Hab niemals Code für sowas gesehen. Die Hilfe scheint da aufzuhören, wo ich starten muß. Ich denke ScanLine (sowieso), vielleicht PixelFormat? Ich schreib es gern im Array. Hab aber noch keine Syntax, die ich anwenden könnte. Keinen Plan, wie ich überhaupt drankommen kann.



  • Original erstellt von <Omega-X>:
    Hab niemals Code für sowas gesehen.

    Kein Wunder, soetwas wie "Pixelverkleinerung" gibt es nicht.
    Ein Pixel ist ein Pixel ist ein Pixel.

    Wenn du ein Bild verkleinern willst musst du dessen Pixelzahl reduzieren, dabei gehen notwendigerweise Informationen verloren. Um die scheinbare Qualität des Bildes zu erhalten musst du interpolieren, das bedeutet, aus einem bestimmten Bereich des Originalbildes einen Durchschnittsfarbwert zu errechnen und diesen dem entsprechenden Pixel im Zielbild zuzuweisen.



  • Wenn ich in einem Malprogramm Pen->Width nicht als absolute Zahl sondern als Berechnung setz, zB. Pen->Width = 1/100*25, mal ich 4 kleine Px in ein normales, kann es so speichern und auch so wieder laden. Die Screenauflösung macht ja etwas in der Art, nur eben global.

    In Grafikprogrammen interpoliert man, weil man das Format erhalten muß. Das Format bestimmt die Pixel-Größe. Fotorealistische Formate lösen feiner auf. Auch in Spielen wird es manchmal verwendet. Das fällt eigentlich erst auf, wenn man ScreenShots vergrößert und sie mit üblichen Bildern vergleicht. Mir genügt es als BMP-Format, weil ja nur das unterstützt wird.

    Wenn ich zB. ScanLine dazu bringen kann, das Bild px für px in der Wunsch-Pixelgröße zu malen, könnte es klappen können. Andernfalls eben Pg.



  • Es gibt keine "Wunsch-Pixelgröße", der Pixel ist die kleinste darstellbare Einheit.
    Entschuldige bitte, aber du hast offensichtlich keine Ahnung (oder eine komplett falsche Auffassung) vom Zusammenhang zwischen Pixeln und Auflösung.



  • Ahnung hab ich wirklich nicht. Das sind nur Beobachtungen. @Jansen, ich will dir auch nicht wiedersprechen, vielleicht muß es nur anders benannt werden. Auf jeden Fall hab ich real schon mit utopisch kleinen Pixeln gemalt. Als eigenständiges Bild oder innerhalb von "normalen" Bildern.

    Mag sein, daß das Pseudopixel sind. Die in den Spielen und in hochauflösenden Fotos dann aber auch. Auf jeden Fall geht es manuell. Der BCB ünterstützt sowas nicht als Format, das will dann den Eindruck vermitteln, daß es das auf der ganzen Welt nicht gibt.

    Was ist TBitmap::PixelFormat?

    ShowMessage(pBitmap->PixelFormat);

    6

    Als int kann ich es nicht schreiben. Wie definier ich einen anderen Wert, um zu sehen, was dadurch verändert wird?



  • Nur mal so eine Defintionsbeschreibung:

    Was ist ein Pixel?

    Ein Computer speichert ein Bild als eine Kombination kleiner, farbiger, rechteckiger (oder quadratischer) Punkte, die Pixel genannt werden. Die Farbe der Pixel geben den durchschnittlichen Farbton, die Sättigung und die Helligkeit des Bereiches auf dem Original wieder, den der Pixel abdeckt.

    Genauer gesagt, je mehr Pixel zur Bildbeschreibung genutzt werden, desto mehr Details können dargestellt werden. Sobald ein Bild mit einer bestimmten Auflösung auf dem Computer abgelegt ist (etwa mit einer bestimmten Anzahl an Pixel), sind die Details des Bildes festgelegt und können nicht erhöht werden. (Die Zahl der Pixel kann durch einen mathematischen Prozess, der Interpolation, erhöht werden. Dadurch werden aber nicht mehr Details dargestellt, sondern lediglich Pixel rechnerisch hinzugefügt, um den Übergang zwischen den Originalpixel weicher zu machen.) Der Wert jedes Pixels (Farbton, Sättigung und Helligkeit) wird normalerweise in drei 8-Bit Binärzahlen (Werte von 0 bis 255) gespeichert und zwar in je einer für die Primärfarben des Lichtes Rot, Grün und Blau. Daraus ergibt sich ein möglicher Farbumfang von 256 x 256 x 256 (16,8 Mio.) Farben für ein sogenanntes 24-Bit Farbbild.

    Quelle: http://www.nikon-euro.com/nikoneuro_de/faq/general/de/FAQ_gen_de_9.htm

    und

    Pixel

    (= Bildpunkt)
    Ein Pixel ist die kleinste darstellbare Grafikeinheit, die ein Computer darstellen kann.

    Es ist ein Quadratischer Punkt auf dem Bildschirm, aus denen sich dan mosaikförmig ein Bild zusammensetzt. Man unterscheidet zwischen der horizontalen und der vertikalen Ausrichtung. 640 x 480 Pixel heißt, daß das Bild in jeder Zeile der Horizontalen (-) aus 640 einzelnen Punkten zusammensetzt. Das ganze hat dann in der Vertikalen ( I ) 480 Zeilen. Das sind dann insgesammt 307200 einzelne Bildpunkte.

    Hier mal ein grobes Beispiel, wie man aus einzelnen Quaraden eine Form gewinnen kann. Hier wurden mit 12 x 7 Bildpunkten das unterstrichene Wort Bug dargestellt. würde man mehr Bildpunkte verwenden, würde das Wort deutlicher und feiner werden.

    Quelle: http://www.computer-bug.de/What%20is/whatpixel.html

    mfg
    Steffen 😉

    [ Dieser Beitrag wurde am 15.01.2003 um 11:44 Uhr von skho editiert. ]



  • Original erstellt von <Omega-X>:
    Was ist TBitmap::PixelFormat?

    Wie wär's mit einem Blick in die Hilfe?


Anmelden zum Antworten