TImage -> DPI wird automatisch auf 96 gesetzt - soll 300 sein.



  • Hallo ^^,

    ich möchte eine vorliegende BMP-Datei (300 dpi) auf einen 600x600 px großen weißen Hintergrund zeichnen und zentrieren, und dann als JPEG-Datei abspeichern.

    Im grunde funktioniert das ganze sehr gut, nur setzt er automatisch die dpi-Größe auf 96 Pixel!

    Kann ich dem irgendwie entgegen wirken? Oder kennt vielleicht einer ne Klasse, bei welcher die dpi-Größe unberührt bleibt? 😃

    Hier mein Code:

    // Benötigte Images erstellen
    TImage * img1 = new TImage(NULL);
    TImage * img2 = new TImage(NULL);
    
    img2->Width = 600; // Breite des 1. Images festsetzen	
    img2->Height = 600; // Höhe des 1. Images festsetzen	
    img2->Canvas->Rectangle(-10,-10,1200,1200); // Hintergrund auffüllen
    img1->Picture->LoadFromFile("tempimg.bmp"); // Bild laden
    
    // Quell- und Ziel-Rect festlegen und das BMP zentriert zeichnen
    
    TRect Source = Rect(0,0,img1->Picture->Width,img1->Picture->Height);
    TRect Dest   = Rect(300 - ( img1->Picture->Width / 2 ),300 - ( img1->Picture->Height / 2 ),300 - ( img1->Picture->Width / 2 )+img1->Picture->Width,300 - ( img1->Picture->Height / 2 )+img1->Picture->Height);
    img2->Canvas->FillRect(Source);
    img2->Canvas->CopyRect(Dest, img1->Canvas, Source);
    img2->Picture->SaveToFile("tempimg.bmp");
    
    // Das Bild als JPEG komprimieren und speichern
    
    TJPEGImage *Jpeg = new TJPEGImage;
    
    Jpeg->Assign(img2->Picture->Bitmap);
    Jpeg->CompressionQuality = 80;
    Jpeg->Compress();
    
    Jpeg->SaveToFile("tempimg.jpg");
    


  • Hallo

    BMPs und auch TImage/TBitmap... haben keine DPI, schließlich gibt es keine physikalischen Grundlagen dafür. DPI-Angaben sind ausschließlich für Ausgaben am Bildschirm und am Drucker sinnvoll.
    Du must dich also darum kümmern ein Bitmap der Größe x,y auf eine Fläche der Größe a,b zu skalieren. Und das machst du mit TCanvas::StretchDraw.

    bis bald
    akari



  • Danke für die schnelle Antwort!

    Wenn ich mit StretchDraw zeichne, dann ist das Bild ja entweder gestaucht oder zu groß (verpixelt), also so ähnlich wie CopyRect und wird auch so gespeichert. Aber dadurch ändert sich ja nicht die dpi-Anzahl ^^ Oder?



  • Sry 4 dp, also die Breite (600) berechne ich dann mit

    600*300/25,4 (inch = 25,4 mm) = 7086,6141732283464566929133858268
    

    und die Höhe (600) genau so

    600*300/25,4 (inch = 25,4 mm) = 7086,6141732283464566929133858268
    

    Doch dann wird das Bild ja auch groß gespeichert hmm 😞



  • Hallo

    Dan82 schrieb:

    Wenn ich mit StretchDraw zeichne, dann ist das Bild ja entweder gestaucht

    Wenn du das Verhältnis von Länge und Breite beibehälst wird nichts gestaucht.

    oder zu groß (verpixelt)

    Ja was soll denn der Computer deiner Meinung nach machen wenn er ein Bild von der Größe 100x100 auf die Größe von 200x200 bringen soll? Klar füllt er die Lücken nach einem gewissen Muster auf. (mit fällt grad nicht das Fachwort ein).
    Das das Bild dann unscharf wird ist klar, diesen Effekt hast du auch in einem Bildbearbeitungsprogramm.

    Aber dadurch ändert sich ja nicht die dpi-Anzahl ^^ Oder?

    Nocheinmal : Bitmaps haben keine DPI, nur Länge und Breite in Pixel. Oder zeig mir mal im Arbeitspeicher die Zoll anhand du Bitmaps messen willst...

    bis bald
    akari



  • Ok, dann ist es also eigendlich garnicht möglich das Bild über TImage zu bearbeiten ohne einen "DPI-Verlust" zu erleiden? Also bring ja auch nicht das nachträgliche vergrößern was, da das Bild beim Laden ja schon auf 96 DPI gerechnet wird? ^^


Anmelden zum Antworten