c #: создать новое одиночное изображение, которое повторяет другое изображение по x раз по горизонтали - PullRequest
3 голосов
/ 09 марта 2010

Я ищу пример кода .NET (System.Drawing.Image), который выполняет следующие действия:

Загрузить данный файл изображения. Создайте новое одиночное изображение, повторяющее оригинальное изображение для x раз по горизонтали.

Ответы [ 2 ]

7 голосов
/ 09 марта 2010

Это создает новое растровое изображение и рисует исходное растровое изображение к нему numTimes раз.

Bitmap b = Bitmap.FromFile(sourceFilename);
Bitmap output = new Bitmap(b.Width * numTimes, b.Height);
Graphics g = Graphics.FromImage(output);

for (int i = 0; i < numTimes; i++) {
  g.DrawImage(b, i * b.Width, 0);
}

// do whatever with the image, here we'll output it
output.Save(outputFilename);

// make sure to clean up too
g.Dispose();
b.Dispose();
output.Dispose();
0 голосов
/ 09 марта 2010

Здесь образец, копирующий каждый пиксель исходного изображения на целевом растровом изображении

    static void Main(string[] args)
    {
        ushort nbCopies = 2;
        Bitmap srcBitmap = (Bitmap)Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg");
        Bitmap dstBitmap = new Bitmap(srcBitmap.Width * nbCopies, srcBitmap.Height, srcBitmap.PixelFormat);

        //Slow method
        for (int curCopy = 0; curCopy < nbCopies; curCopy++)
        {
            for (int x = 0; x < srcBitmap.Width; x++)
            {
                for (int y = 0; y < srcBitmap.Height; y++)
                {
                    Color c = srcBitmap.GetPixel(x, y);
                    dstBitmap.SetPixel(x + (curCopy * srcBitmap.Width), y, c);
                }
            }
        }

        //OR

        //Fast method using unsafe code
        BitmapData srcBd = srcBitmap.LockBits(new Rectangle(Point.Empty, srcBitmap.Size), ImageLockMode.ReadOnly, srcBitmap.PixelFormat);
        BitmapData dstBd = dstBitmap.LockBits(new Rectangle(Point.Empty, dstBitmap.Size), ImageLockMode.WriteOnly, dstBitmap.PixelFormat);
        unsafe
        {
            for (int curCopy = 0; curCopy < nbCopies; curCopy++)
            {
                for (int y = 0; y < srcBitmap.Height; y++)
                {
                    byte* srcRow = (byte*)srcBd.Scan0 + (y * srcBd.Stride);
                    byte* dstRow = (byte*)dstBd.Scan0 + (y * dstBd.Stride) + (curCopy * srcBd.Stride);

                    for (int x = 0; x < srcBitmap.Width; x++)
                    {
                        //Copy each composant value (typically RGB)
                        for (int comp = 0; comp < (srcBd.Stride / srcBd.Width); comp++)
                        {
                            dstRow[x * 3 + comp] = srcRow[x * 3 + comp];
                        }
                    }
                }

            }
        }
        dstBitmap.UnlockBits(dstBd);
        srcBitmap.UnlockBits(srcBd);

        dstBitmap.Save(@"C:\Users\Public\Pictures\Sample Pictures\Koala_multiple.jpg");

        dstBitmap.Dispose();
        srcBitmap.Dispose();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...