2012-04-18 26 views
5

Chcę utworzyć program, który scala obrazy PNG w jeden PNG. Wszystkie obrazy mają 78px wysokości, 120px szerokości, więc utworzyłem bitmapę 1200x78 (muszę scalić 10 obrazów) Łączy się, ale każdy obraz w wynikach png jest skalowany w przybliżeniu x2. Czemu?.NET skaluje obraz podczas rysowania do grafiki

Oto mój kod:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Security; 
using System.Drawing.Imaging; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     OpenFileDialog openFileDialog1; 
     Bitmap bitmap; 

     public Form1() 
     { 
      InitializeComponent(); 
      openFileDialog1 = new OpenFileDialog(); 
      openFileDialog1.Multiselect = true; 
      openFileDialog1.Filter = 
     "Images (*.PNG;*.JPG;*.GIF)|*.PNG;*.JPG;*.GIF|" + 
     "All files (*.*)|*.*"; 
      openFileDialog1.Title = "Select images to merge"; 

      bitmap = new Bitmap(1200, 78); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      DialogResult dr = this.openFileDialog1.ShowDialog(); 

      if (dr == System.Windows.Forms.DialogResult.OK) 
      { 
       // Read the files 
       int shift = 0; 
       foreach (String file in openFileDialog1.FileNames) 
       { 
        // Create a PictureBox. 
        try 
        { 
         PictureBox pb = new PictureBox(); 
         Image loadedImage = Image.FromFile(file); 
         pb.Height = loadedImage.Height; 
         pb.Width = loadedImage.Width; 
         pb.Image = loadedImage; 
         flowLayoutPanel2.Controls.Add(pb); 

         paintToBitmap(loadedImage, shift); 

         shift += loadedImage.Width; 
        } 
        catch (SecurityException ex) 
        { 
         // The user lacks appropriate permissions to read files, discover paths, etc. 
         MessageBox.Show("Security error\n\n" + 
          "Error message: " + ex.Message + "\n\n" + 
          "Details (send to Support):\n\n" + ex.StackTrace 
         ); 
        } 
        catch (Exception ex) 
        { 
         // Could not load the image - probably related to Windows file system permissions. 
         MessageBox.Show("!!!"); 
        } 
       } 


       saveImage(); 
      } 
     } 

     private void paintToBitmap(Image image, int shift) 
     {   
      Graphics graphics = Graphics.FromImage(bitmap); 
      graphics.DrawImage(image, new Point(shift, 0)); 
     } 

     private void saveImage() 
     { 
      bitmap.Save("d:\\result.png", System.Drawing.Imaging.ImageFormat.Png); 
     } 

     private void flowLayoutPanel2_Paint(object sender, PaintEventArgs e) 
     { 

     } 
    } 
} 
+0

wpadłem swój kod i wydaje się działać prawidłowo. Czy możesz dołączyć jeden ze swoich obrazów wejściowych? Domyślam się, że jest to problem związany z Twoimi obrazami pod względem dpi lub podobne. – Till

+0

http://files.moonmana.com/forums/m1.png http://files.moonmana.com/forums/m2.png –

Odpowiedz

3

Spróbuj zaktualizować swój kod do tego

graphics.DrawImage(image, new Rectangle(shift, 0,120,78)); 
+0

Wielkie dzięki, pomógł prostokąt, ale trzeci parametr to szerokość, więc powinno być tylko 120, bez przesunięcia. graphics.DrawImage (image, new Rectangle (shift, 0,120,78)); –

+0

Edytuję, więc zaznacz proszę jako odpowiedź – Likurg

1

Wydaje się, że starają się dostosować obraz do rozmiaru „różowego psa: P” obraz. Gdy wypełnisz obraz tłem, powstaje inny sposób. zobacz:

http://i.stack.imgur.com/3eVEu.png http://i.stack.imgur.com/DaygF.png http://i.stack.imgur.com/xwEve.png

tak, problem wydaje się być w niewidzialnej tle obrazu.

+2

Skąd wiadomo, że twój przykład działa, jeśli używasz prostokątów wypełnionych jednym kolorem ? :) Rysujesz prostokąt o wielkości 0,0, który został narysowany w skali od 120 do 240, niż rysujesz następny prostokąt w 120, więc nakłada się on na część pierwszego prostokąta o zmienionym rozmiarze i tak dalej;) –

+0

sprawdź mój edytowany komentarz :) –

+0

zobacz moją odpowiedź edycji – MarcoM

Powiązane problemy