Bagaimana cara mengubah ukuran gambar, dengan kualitas gambar tidak terpengaruh?
Bagaimana cara mengubah ukuran gambar, dengan kualitas gambar tidak terpengaruh?
Jawaban:
Seperti yang dikatakan rcar , Anda tidak bisa tanpa kehilangan beberapa kualitas, hal terbaik yang dapat Anda lakukan di 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));
}
Kecuali Anda melakukan grafik vektor, tidak ada cara untuk mengubah ukuran gambar tanpa berpotensi kehilangan beberapa kualitas gambar.
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;
}
Saya yakin apa yang ingin Anda lakukan adalah "Ubah Ukuran / Sampel Ulang" gambar Anda. Berikut adalah situs bagus yang memberikan instruksi dan menyediakan kelas utilitas (Yang kebetulan juga saya gunakan):
http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx
Kecuali Anda mengubah ukurannya, Anda tidak dapat melakukan ini dengan grafik raster.
Yang dapat Anda lakukan dengan pemfilteran dan penghalusan yang baik adalah mengubah ukuran tanpa kehilangan kualitas yang terlihat .
Anda juga dapat mengubah metadata DPI gambar (dengan asumsi ada beberapa) yang akan mempertahankan jumlah piksel yang persis sama, tetapi akan mengubah cara editor gambar memikirkannya dalam pengukuran 'dunia nyata'.
Dan hanya untuk mencakup semua basis, jika yang Anda maksud hanyalah ukuran file gambar dan bukan dimensi gambar yang sebenarnya, saya sarankan Anda melihat pengkodean lossless dari data gambar. Saran saya untuk ini adalah menyimpan kembali gambar sebagai file .png (Saya cenderung menggunakan paint sebagai transcoder gratis untuk gambar di windows. Muat gambar di paint, simpan seperti dalam format baru)
Anda tidak dapat mengubah ukuran gambar tanpa kehilangan beberapa kualitas, hanya karena Anda mengurangi jumlah piksel.
Jangan mengurangi ukuran sisi klien, karena browser tidak melakukan pekerjaan yang baik dalam mengubah ukuran gambar.
Yang dapat Anda lakukan adalah mengubah ukuran secara terprogram sebelum Anda merendernya, atau saat pengguna mengunggahnya.
Berikut adalah artikel yang menjelaskan salah satu cara melakukan ini di c #: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx
Lihat apakah Anda menyukai kualitas pengubahan ukuran gambar dari modul ASP.NET open source ini. Ada demo langsung, jadi Anda bisa mengotak-atiknya sendiri. Ini menghasilkan hasil yang (bagi saya) tidak mungkin dibedakan dari keluaran Photoshop. Ini juga memiliki ukuran file yang serupa - MS melakukan pekerjaan dengan baik pada encoder JPEG mereka.
Ada sesuatu di luar sana, pengubahan ukuran sadar konteks, tidak tahu apakah Anda akan dapat menggunakannya, tetapi itu layak untuk dilihat, itu pasti
Video demo yang bagus (Pembesaran muncul di 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 bisa Anda terapkan pada gambar yang diperbesar untuk sedikit mengaburkan piksel, Anda bisa melihatnya.
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 jenis gambar apa - foto, gambar garis tajam, atau apa? Menulis kode penggilingan piksel tingkat rendah Anda sendiri atau mencoba melakukannya sebanyak mungkin dengan pustaka yang ada (.net atau apa pun)?
Ada banyak pengetahuan tentang topik ini. Konsep utamanya 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=Position&view=Quick&fr=26&select=629945
* ini khusus untuk Java tetapi mungkin mendidik - http: //today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html
Di sini Anda dapat menemukan juga menambahkan kode watermark 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>();
}
}
Berikut adalah utas forum yang menyediakan contoh kode pengubah ukuran gambar C #. Anda dapat menggunakan salah satu pengikat pustaka GD untuk melakukan pengambilan sampel ulang di C #.