it-swarm-id.com

Mengubah ukuran gambar tanpa kehilangan kualitas

Saya perlu mengubah ukuran gambar, tetapi kualitas gambar tidak dapat dipengaruhi oleh ini.

104
public static

Seperti rcar mengatakan, Anda tidak bisa tanpa kehilangan beberapa kualitas, yang terbaik yang dapat Anda lakukan dalam c # adalah:

Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
    gr.SmoothingMode = SmoothingMode.HighQuality;
    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}
211
Kris Erickson

Kecuali jika Anda melakukan grafik vektor, tidak ada cara untuk mengubah ukuran gambar tanpa berpotensi kehilangan kualitas gambar.

32
Randy
private static Image resizeImage(Image imgToResize, Size size)
{
    int sourceWidth = imgToResize.Width;
    int sourceHeight = imgToResize.Height;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = ((float)size.Width / (float)sourceWidth);
    nPercentH = ((float)size.Height / (float)sourceHeight);

    if (nPercentH < nPercentW)
        nPercent = nPercentH;
    else
        nPercent = nPercentW;

    int destWidth = (int)(sourceWidth * nPercent);
    int destHeight = (int)(sourceHeight * nPercent);

    Bitmap b = new Bitmap(destWidth, destHeight);
    Graphics g = Graphics.FromImage((Image)b);
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
    g.Dispose();

    return (Image)b;
}

dari di sini

24
ozba

Saya yakin yang ingin Anda lakukan adalah "Ubah Ukuran/Ubah Contoh" gambar Anda. Berikut adalah situs bagus yang memberikan instruksi dan menyediakan kelas utilitas (Bahwa saya juga kebetulan menggunakan):

http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx

5
Ashlocke

Anda tidak dapat mengubah ukuran gambar tanpa kehilangan kualitas, hanya karena Anda mengurangi jumlah piksel.

Jangan kurangi ukuran sisi klien, karena browser tidak melakukan pekerjaan yang baik untuk mengubah ukuran gambar.

Yang dapat Anda lakukan adalah mengubah ukuran secara terprogram sebelum Anda membuatnya, atau ketika pengguna mengunggahnya.

Berikut ini adalah artikel yang menjelaskan satu cara untuk melakukan ini di c #: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx

3
AaronS

Kecuali Anda mengubah ukuran ke atas, Anda tidak dapat melakukan ini dengan grafik raster.

Yang dapat Anda lakukan dengan pemfilteran dan pemulusan yang baik adalah mengubah ukuran tanpa kehilangan kualitas terlihat.

Anda juga dapat mengubah metadata DPI gambar (dengan asumsi memiliki beberapa) yang akan menjaga jumlah piksel yang sama persis, tetapi akan mengubah cara editor gambar memikirkannya dalam pengukuran 'dunia nyata'.

Dan hanya untuk mencakup semua pangkalan, jika Anda benar-benar berarti hanya ukuran file gambar dan bukan dimensi gambar yang sebenarnya, saya sarankan Anda melihat penyandian data gambar lossless. Saran saya untuk ini adalah resave gambar sebagai file .png (Saya cenderung menggunakan Paint sebagai transcoder gratis untuk gambar di windows. Memuat gambar di Paint, simpan seperti dalam format baru)

3
workmad3

Lihat apakah Anda suka kualitas ukuran gambar dari modul ASP.NET open source ini. Ada demo langsung, sehingga Anda dapat mengacaukannya sendiri. Ini menghasilkan hasil yang (bagi saya) tidak mungkin dibedakan dari keluaran Photoshop. Ini juga memiliki ukuran file yang serupa - MS melakukan pekerjaan yang baik pada encoder JPEG mereka.

2
Nathanael Jones

Ada sesuatu di luar sana, mengubah ukuran konteks sadar, tidak tahu apakah Anda akan dapat menggunakannya, tapi itu layak dilihat, itu pasti

Demo video yang bagus (Pembesaran muncul di bagian tengah) http://www.youtube.com/watch?v=vIFCV2spKtg

Di sini mungkin ada beberapa kode. http://www.semanticmetadata.net/2007/08/30/content-aware-image-resizing-gpl-implementation/

Apakah itu berlebihan? Mungkin ada beberapa filter mudah yang dapat Anda terapkan pada gambar yang diperbesar untuk mengaburkan piksel sedikit, Anda bisa melihatnya.

1
Victor

Di sini Anda dapat menemukan juga menambahkan kode tanda air di kelas ini:

public class ImageProcessor
    {
        public Bitmap Resize(Bitmap image, int newWidth, int newHeight, string message)
        {
            try
            {
                Bitmap newImage = new Bitmap(newWidth, Calculations(image.Width, image.Height, newWidth));

                using (Graphics gr = Graphics.FromImage(newImage))
                {
                    gr.SmoothingMode = SmoothingMode.AntiAlias;
                    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    gr.DrawImage(image, new Rectangle(0, 0, newImage.Width, newImage.Height));

                    var myBrush = new SolidBrush(Color.FromArgb(70, 205, 205, 205));

                    double diagonal = Math.Sqrt(newImage.Width * newImage.Width + newImage.Height * newImage.Height);

                    Rectangle containerBox = new Rectangle();

                    containerBox.X = (int)(diagonal / 10);
                    float messageLength = (float)(diagonal / message.Length * 1);
                    containerBox.Y = -(int)(messageLength / 1.6);

                    Font stringFont = new Font("verdana", messageLength);

                    StringFormat sf = new StringFormat();

                    float slope = (float)(Math.Atan2(newImage.Height, newImage.Width) * 180 / Math.PI);

                    gr.RotateTransform(slope);
                    gr.DrawString(message, stringFont, myBrush, containerBox, sf);
                    return newImage;
                }
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }

        public int Calculations(decimal w1, decimal h1, int newWidth)
        {
            decimal height = 0;
            decimal ratio = 0;


            if (newWidth < w1)
            {
                ratio = w1 / newWidth;
                height = h1 / ratio;

                return height.To<int>();
            }

            if (w1 < newWidth)
            {
                ratio = newWidth / w1;
                height = h1 * ratio;
                return height.To<int>();
            }

            return height.To<int>();
        }

    }
1
cagin

Apakah Anda mengubah ukuran lebih besar, atau lebih kecil? Dengan% kecil atau dengan faktor yang lebih besar seperti 2x, 3x? Apa yang Anda maksud dengan kualitas untuk aplikasi Anda? Dan apa jenis gambar - foto, gambar garis keras, atau apa? Menulis kode penggilingan piksel tingkat rendah Anda sendiri atau mencoba melakukannya sebanyak mungkin dengan perpustakaan yang ada (.net atau apa pun)?

Ada banyak pengetahuan tentang topik ini. Konsep kuncinya adalah interpolasi.

Rekomendasi penjelajahan:
* http://www.all-in-one.ee/~dersch/interpolator/interpolator.html
* http://www.cambridgeincolour.com/tutorials/image-interpolation.htm
* untuk C #: https://secure.codeproject.com/KB/GDI-plus/imageprocessing4.aspx?display=PrintAll&fid=3657&df=90&mpp=25&noise=3&sort=Pick&fr=26&select = 629945 * ini khusus untuk Jawa tetapi mungkin mendidik - http://today.Java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance. html

1
DarenW

Berikut adalah tas forum yang menyediakan sampel kode ukuran gambar C #. Anda dapat menggunakan salah satu pustaka Gd binder untuk melakukan resampling dalam C #.

0
jimg