Birçoğumuzun başına gelmiştir. Bir program yazarız, tam da bu program için güzel bir icon veya image buluruz, webden veya bir arkadaştan. Gel zaman git zaman yine bir gün bilgisayar başında hangi image ve icon kullanacam diye kara kara düşünürken geçmiştekiler gelir aklımıza. Önceki kullandığımız image veya icon'lar geçer gözümüzün önünden bir film şeridi gibi. Peki bu anda ya o image veya icon'ların nereye gittiği belli değilse? Ya da eski bir diskle, ya da artık kullanılmayan bir maille tarihin derinliklerine gömüldüyse? İşte amacımız elimizdeki .dll veya .exe'den image ve icon'ları alabilmek.

İlk yapacağımız seçilen dosyanın assembly bilgisini almak ve içindeki resource ları almak. Sonrasında ise bu resource ları teker teker çözümlemek.
Assembly assembly = Assembly.LoadFile(fileName);
string[] names = assembly.GetManifestResourceNames();
for (int i = 0; i < names.Length; i++)
{
ManifestResourceInfo info = assembly.GetManifestResourceInfo(names[i]);
ResourceContainer container = new ResourceContainer(names[i]);
container.Resolve(assembly, names[i]);
cbResources.Items.Add(container);
}
public void Resolve(Assembly assembly, string name)
{
_Items = new List<IResourceItem>();
Stream resourceStream = assembly.GetManifestResourceStream(name);
if (resourceStream == null)
return;
ManifestResourceInfo info = assembly.GetManifestResourceInfo(name);
if (((info.ResourceLocation & ResourceLocation.Embedded) == ResourceLocation.Embedded) && name.EndsWith(".resources"))
{
ResourceReader reader = new ResourceReader(resourceStream);
IDictionaryEnumerator enumerator = reader.GetEnumerator();
while (enumerator.MoveNext())
{
string type = string.Empty;
string key = enumerator.Key.ToString();
byte[] values = null;
reader.GetResourceData(key, out type, out values);
List<IResourceItem> items = ResourceItem.GetResourceItem(key, enumerator.Value, resourceStream);
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
Items.Add(items[i]);
}
}
}
}
}
Daha sonrasında ise çözümlenen bu resource lardan işimize yarayacak bilgileri alıyoruz.
public static List<IResourceItem> GetResourceItem(string name, object value, Stream stream)
{
if (value is string)
{
StringResourceItem item = new StringResourceItem(name, value);
return new List<IResourceItem>() { item };
}
else if (value is Icon)
{
IconResourceItem item = new IconResourceItem(name, value);
return new List<IResourceItem>() { item };
}
else if (value is ImageListStreamer)
{
List<IResourceItem> items = new List<IResourceItem>();
using (ImageList list = new ImageList())
{
list.ImageStream = value as ImageListStreamer;
int index = 0;
foreach (Image image in list.Images)
{
items.Add(new ImageResourceItem(name, image, index));
index++;
}
}
return items;
}
else if (value is Image)
{
ImageResourceItem item = new ImageResourceItem(name, value, -1);
return new List<IResourceItem>() { item };
}
else
{
object v = value;
}
return null;
}
Tek tek image ve icon'larla uğraşamam ben arkadaş diyenler de "Save All Images" dediğinde tüm image ve icon'lar seçilen klasöre kaydediliyor.
private void _SaveAllImages()
{
if (cbResources.Items.Count == 0)
{
_LoadResources();
}
lblMessage.Text = "Saving...";
Application.DoEvents();
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
{
if (!string.IsNullOrEmpty(Properties.Settings.Default.DefaultSavePath))
{
dialog.SelectedPath = Properties.Settings.Default.DefaultSavePath;
}
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Properties.Settings.Default.DefaultSavePath = dialog.SelectedPath;
Properties.Settings.Default.Save();
string iconDirectory = dialog.SelectedPath + "\\Icons";
string imageDirectory = dialog.SelectedPath + "\\Images";
if (!Directory.Exists(iconDirectory))
Directory.CreateDirectory(iconDirectory);
if (!Directory.Exists(imageDirectory))
Directory.CreateDirectory(imageDirectory);
for (int resourceIndex = 0; resourceIndex < cbResources.Items.Count; resourceIndex++)
{
ResourceContainer container = cbResources.Items[resourceIndex] as ResourceContainer;
string[] names = container.Name.Split(new char[] { '.' });
for (int itemIndex = 0; itemIndex < container.Items.Count; itemIndex++)
{
IResourceItem item = container.Items[itemIndex];
string fileName = string.Empty;
if (item.ResourceType == ResourceType.Icon)
{
IconResourceItem resourceItem = item as IconResourceItem;
if (resourceItem.Icon != null)
{
if (names.Length > 1)
{
fileName = dialog.SelectedPath + "\\Icons\\" + names[names.Length - 2] + ".ico";
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
resourceItem.Icon.Save(fs);
fs.Flush();
}
}
}
}
else if (item.ResourceType == ResourceType.Image)
{
ImageResourceItem imageItem = item as ImageResourceItem;
if (imageItem.Image != null)
{
string name = imageItem.Name;
if (imageItem.Index != -1)
{
name = imageItem.Index.ToString();
}
fileName = dialog.SelectedPath + "\\Images\\" + names[names.Length - 2] + "_" + imageItem.Width.ToString() + "_" + name + ".png";
imageItem.Image.Save(fileName, ImageFormat.Png);
}
}
}
}
MessageBox.Show("Operation Finished", "Success", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
lblMessage.Visible = false;
}

Kaynak kodları indirmek için : http://www.codeproject.com/KB/dotnet/ExtractImagesIcons.aspx
Esen kalın...