You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.5 KiB
141 lines
3.5 KiB
using System;
|
|
using System.IO;
|
|
using FreeImageAPI;
|
|
|
|
namespace Sample02
|
|
{
|
|
class Program
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
// Check if FreeImage.dll is available (can be in %path%).
|
|
if (!FreeImage.IsAvailable())
|
|
{
|
|
Console.WriteLine("FreeImage.dll seems to be missing. Aborting.");
|
|
return;
|
|
}
|
|
|
|
Sample sample = new Sample();
|
|
sample.Example();
|
|
}
|
|
}
|
|
|
|
public class Sample
|
|
{
|
|
const string fileName = @"multipaged.tif";
|
|
FIMULTIBITMAP dib = new FIMULTIBITMAP();
|
|
Random rand = new Random();
|
|
|
|
public void Example()
|
|
{
|
|
if (!File.Exists(fileName))
|
|
{
|
|
Console.WriteLine("File not found. Aborting.");
|
|
return;
|
|
}
|
|
|
|
// Load the multipaged bitmap.
|
|
// 'OpenMultiBitmapEx' tries to find the correct file format, loads the bitmap
|
|
// with default options, with write support and does not use caching.
|
|
dib = FreeImage.OpenMultiBitmapEx(fileName);
|
|
|
|
// Check whether loading succeeded.
|
|
if (dib.IsNull)
|
|
{
|
|
Console.WriteLine("File could not be loaded. Aborting.");
|
|
return;
|
|
}
|
|
|
|
// Get the number of bitmaps the multipaged bitmap contains.
|
|
int count = FreeImage.GetPageCount(dib);
|
|
|
|
// Multipaged bitmaps consist of multiple single FIBITMAPs
|
|
FIBITMAP page = new FIBITMAP();
|
|
|
|
// There are bitmaps we can work with.
|
|
if (count > 0)
|
|
{
|
|
// Lock a random bitmap to work with.
|
|
page = FreeImage.LockPage(dib, rand.Next(0, count));
|
|
}
|
|
|
|
// Check whether locking succeeded.
|
|
if (page.IsNull)
|
|
{
|
|
// Locking failed. Unload the bitmap and return.
|
|
FreeImage.CloseMultiBitmapEx(ref dib);
|
|
return;
|
|
}
|
|
|
|
// Get a list of locked pages. This can be usefull to check whether a page has already been locked.
|
|
int[] lockedPages = FreeImage.GetLockedPages(dib);
|
|
|
|
// Lets modify the page.
|
|
if (FreeImage.AdjustGamma(page, 2d))
|
|
{
|
|
Console.WriteLine("Successfully changed gamma of page {0}.", lockedPages[0]);
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("Failed to adjust gamma ...");
|
|
}
|
|
|
|
// Print out the list of locked pages
|
|
foreach (int i in lockedPages)
|
|
Console.WriteLine("Page {0} is locked.", i);
|
|
|
|
// Use 'UnlockPage' instead of 'Unload' to free the page. Set the third parameter to 'true'
|
|
// so that FreeImage can store the changed page within the multipaged bitmap.
|
|
FreeImage.UnlockPage(dib, page, true);
|
|
|
|
// Retieve the list again to see whether unlocking succeeded.
|
|
lockedPages = FreeImage.GetLockedPages(dib);
|
|
|
|
// No output should be produced here.
|
|
foreach (int i in lockedPages)
|
|
Console.WriteLine("Page {0} is still locked.", i);
|
|
|
|
// If there are more than one page we can swap them
|
|
if (count > 1)
|
|
{
|
|
if (!FreeImage.MovePage(dib, 1, 0))
|
|
{
|
|
Console.WriteLine("Swapping pages failed.");
|
|
}
|
|
}
|
|
|
|
if (count > 2)
|
|
{
|
|
// Lock page 2
|
|
page = FreeImage.LockPage(dib, 2);
|
|
if (!page.IsNull)
|
|
{
|
|
// Clone the page for later appending
|
|
FIBITMAP temp = FreeImage.Clone(page);
|
|
|
|
// Unlock the page again
|
|
FreeImage.UnlockPage(dib, page, false);
|
|
|
|
// Delete the page form the multipaged bitmap
|
|
FreeImage.DeletePage(dib, 2);
|
|
|
|
// Append the clone again
|
|
FreeImage.AppendPage(dib, temp);
|
|
|
|
// Check whether the number of pages is still the same
|
|
Console.WriteLine("Pages before: {0}. Pages after: {1}", count, FreeImage.GetPageCount(dib));
|
|
|
|
// Unload clone to prevent memory leak
|
|
FreeImage.UnloadEx(ref temp);
|
|
}
|
|
}
|
|
|
|
// We are done and close the multipaged bitmap.
|
|
if (!FreeImage.CloseMultiBitmapEx(ref dib))
|
|
{
|
|
Console.WriteLine("Closing bitmap failed!");
|
|
}
|
|
}
|
|
}
|
|
}
|