Context Image Resizer – Resize ảnh qua menu ngữ cảnh

gnome-mime-imageHiện nay việc chụp ảnh trở nên rất dễ dàng và thuận tiện. Điều này khiến ổ cứng của tôi bị ngốn khá nhiều dung lượng. Chính vì vậy tôi tạo một tool đơn giản để resize ảnh hàng loạt (để giảm dung lượng) từ menu ngữ cảnh với hi vọng có thêm dung lượng để nhét được nhiều ảnh mới sau này.

Giới thiệu chương trình

Tôi lưu danh sách các kích thước ảnh trong file .config nên bạn có thể dễ dàng thay đổi khi cần thiết (thủ công hoặc thêm chức năng cấu hình).
Để sử dụng trước tiên bạn cần chạy file .exe của chương trình để đăng kí menu vào registry. Sau đó bạn có thể bắt đầu chọn các bức ảnh và resize chúng thông qua menu ngữ cảnh.

Context-menu-image-resizer

ContextImageResizerUI

Đây là chỉ là phiên bản demo với chức năng và hiệu quả còn hạn chế, tuy nhiên bạn có thể cải tiến để làm chương trình hữu dụng hơn từ source code này.

Source code: https://github.com/phamtung1/ContextImageResizer

Đăng ký menu ngữ cảnh cho tất cả loại file

Bạn chỉ cần tạo một key con (ví dụ ContextImageResizer) trong registry theo đường dẫn bên dưới. Sau đó tạo một key con “command” chứa lệnh sẽ thực hiện khi menu được kích hoạt.

HKEY_CLASSES_ROOT\*\shell

private const string MENU_PATH = @"*\shell\ContextImageResizer";
private const string MENU_COMMAND = @"*\shell\ContextImageResizer\command";

public static void AddMenu(string menuCaption, string command)
{
	using (var regMenu = Registry.ClassesRoot.CreateSubKey(MENU_PATH))
	{
		if (regMenu != null)
		{
			regMenu.SetValue(string.Empty, menuCaption);
		}

		using (var regCommand = Registry.ClassesRoot.CreateSubKey(MENU_COMMAND))
		{
			if (regCommand != null)
			{
				regCommand.SetValue(string.Empty, command);
			}
		}
	}
}

Resize ảnh với độ phân giải được giữ nguyên

Để làm được điều này bạn cần tính tỉ lệ của kích thước dài, rộng ảnh nguồn và ảnh đích. Ta sẽ lấy tỉ lệ nhỏ hơn để làm tỉ lệ thay đổi kích thước ảnh.

private static Bitmap ResizeImage(Image image, int maxWidth, int maxHeight)
{
	int sourceWidth = image.Width;
	int sourceHeight = image.Height;

	float ratio = 0;
	float widthRatio = 0;
	float heightRatio = 0;

	widthRatio = ((float)maxWidth / (float)sourceWidth);
	heightRatio = ((float)maxHeight / (float)sourceHeight);
	ratio = Math.Min(heightRatio, widthRatio);

	var destWidth = (int)Math.Ceiling(sourceWidth * ratio);
	var destHeight = (int)Math.Ceiling(sourceHeight * ratio);

	var destImage = new Bitmap(destWidth, destHeight);
	destImage.SetResolution(image.HorizontalResolution,
					 image.VerticalResolution);

	using (Graphics graphics = Graphics.FromImage(destImage))
	{
		graphics.CompositingMode = CompositingMode.SourceCopy;
		graphics.CompositingQuality = CompositingQuality.HighQuality;
		graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
		graphics.SmoothingMode = SmoothingMode.HighQuality;
		graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

		graphics.DrawImage(image,
			new Rectangle(0, 0, destWidth, destHeight),
			new Rectangle(0, 0, sourceWidth, sourceHeight),
			GraphicsUnit.Pixel);
	}

	return destImage;
}

YinYangIt Blog

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s