Двойная миниатюра папки с изображениями Windows 7 - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу программно создать миниатюру из папки с изображениями, которая выглядела бы как стиль папки с изображениями в Windows 7, подобный картинке, которую я загрузил здесь.У меня есть подпрограмма, которая добавляет изображения друг на друга и поворачивает их по оси X, но я думаю, что мне нужно какое-то вращение Y или что-то еще, чтобы завершить эту иллюзию.Я на самом деле сделал это с Windows7APICodePack с тамошними методами, но кажется, что он заставляет вас использовать Проводник в режиме больших значков.Я не хочу, чтобы это зависело от Explorer.Также я не хочу использовать WPF (ViewPort3d).Вот как я хочу, чтобы это выглядело так: FinalImage http://www.chuckcondron.com/folderexample.JPG

Вот что я сделал до сих пор: StitchedImageThumb http://www.chuckcondron.com/stitchedImageThumb.jpg

Как вы можете видеть, моя попытка не такая уж красивая,и при этом фотографии не выходят из папки кремового цвета (на самом деле можно использовать и сам рисунок папки, но не знаю, как это сделать).

текущий код (c #)

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;


namespace ThumbnailCreator
{
public partial class Form1: Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //get all the files in a directory
        string[] files = Directory.GetFiles(@"C:\MyImages");

        //combine them into one image
        Bitmap stitchedImage = Combine(files);

        if(File.Exists("stitchedImage.jpg")) File.Delete("stitchedImage.jpg");
        //save the new image
        stitchedImage.Save(@"stitchedImage.jpg", ImageFormat.Jpeg);

        if (File.Exists("stitchedImage.jpg"))
        {
            FileStream s = File.Open("stitchedImage.jpg", FileMode.Open);
            Image temp = Image.FromStream(s);
            s.Close();
            pictureBox1.Image = temp;
        }
        CreateThumb(@"stitchedImage.jpg", @"stitchedImageThumb.jpg");
    }

    public Bitmap Combine(string[] files)
    {
        //read all images into memory
        List<Bitmap> images = new List<Bitmap>();
        Bitmap finalImage = null;

        try
        {
            int width = 0;
            int height = 0;
            int rotate = 7;

            foreach (string image in files)
            {
                //create a Bitmap from the file and add it to the list
                Bitmap bitmap = new Bitmap(image);
                bitmap = RotateImage(bitmap, rotate);
                //update the size of the final bitmap
                //width += bitmap.Width;
                width = 2500;
                //height = bitmap.Height > height ? bitmap.Height : height;
                height = 1000;
                images.Add(bitmap);
                rotate += 5;
            }
            //create a bitmap to hold the combined image
            finalImage = new Bitmap(width, height);

            //get a graphics object from the image so we can draw on it
            using (Graphics g = Graphics.FromImage(finalImage))
            {
                //set background color
                g.Clear(Color.Goldenrod);
                //go through each image and draw it on the final image
                ImageAttributes ia = new ImageAttributes();
                ColorMatrix cm = new ColorMatrix();
                cm.Matrix33 = 0.75f;
                ia.SetColorMatrix(cm);

                foreach (Bitmap image in images)
                {
                    Image rotatedImage = new Bitmap(image);
                    g.DrawImage(rotatedImage, new Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, ia);
                }
            }
            return finalImage;
        }
        catch (Exception ex)
        {
            if (finalImage != null)
                finalImage.Dispose();

            throw ex;
        }
        finally
        {
            //clean up memory
            foreach (System.Drawing.Bitmap image in images)
            {
                image.Dispose();
            }
        }
    }

    public void CreateThumb(string source, string destination)
    {
        Image imgThumb = null;
        try
        {
            Image image = null;
            // Check if image exists
            image = Image.FromFile(source);
            if (image != null)
            {
                imgThumb = image.GetThumbnailImage(100, 100, null, new IntPtr());
                imgThumb.Save(destination);
                image.Dispose();
            }
        }
        catch
        {
            MessageBox.Show("An error occured");
        }

        if (File.Exists(destination))
        {
            FileStream s = File.Open(destination, FileMode.Open);
            Image temp = Image.FromStream(s);
            s.Close();
            pictureBox2.Image = temp;
        }
    }

    private Bitmap RotateImage(Bitmap inputImg, double degreeAngle)
    {
        //Corners of the image
        PointF[] rotationPoints = { new PointF(0, 0),
                                    new PointF(inputImg.Width, 0),
                                    new PointF(0, inputImg.Height),
                                    new PointF(inputImg.Width, inputImg.Height)};

        //Rotate the corners
        PointMath.RotatePoints(rotationPoints, new PointF(inputImg.Width / 2.0f, inputImg.Height / 2.0f), degreeAngle);

        //Get the new bounds given from the rotation of the corners
        //(avoid clipping of the image)
        Rectangle bounds = PointMath.GetBounds(rotationPoints);

        //An empy bitmap to draw the rotated image
        Bitmap rotatedBitmap = new Bitmap(bounds.Width *2, bounds.Height *2);

        using (Graphics g = Graphics.FromImage(rotatedBitmap))
        {
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            //Transformation matrix
            Matrix m = new Matrix();
            m.RotateAt((float)degreeAngle, new PointF(inputImg.Width / 2.0f, inputImg.Height / 2.0f));
            m.Translate(-bounds.Left, -bounds.Top, MatrixOrder.Append); //shift to compensate for the rotation

            g.Transform = m;
            g.DrawImage(inputImg, 0, 0);
        }
        return rotatedBitmap;
    }
}
}
...