public static extern void UnlockPage(FIMULTIBITMAP bitmap, int page, bool changed);
public static extern bool GetLockedPageNumbers(FIMULTIBITMAP bitmap, IntPtr pages, IntPtr count);
public static extern void AppendPage(FIMULTIBITMAP bitmap, FIBITMAP data);
public static extern void DeletePage(FIMULTIBITMAP bitmap, int page);
public static extern void AppendPage(FIMULTIBITMAP bitmap, FIBITMAP data);
public static extern long CloseMultiBitmap(FIMULTIBITMAP bitmap, int flags);
/// <summary> /// Decodes the given stream, selects the correct page or frame, rotates it correctly (if autorotate=true), then executes the callback, then cleans up. /// </summary> /// <param name="s"></param> /// <param name="settings"></param> /// <param name="callback"></param> /// <returns></returns> public static object DecodeAndCall(Stream s, ResizeSettings settings, DecodeCallback callback) { if (!FreeImageAPI.FreeImage.IsAvailable()) { return(null); } FREE_IMAGE_LOAD_FLAGS flags = FREE_IMAGE_LOAD_FLAGS.DEFAULT; //If we're not tone-mapping the raw file, convert it for display if (!HasToneMappingCommands(settings)) { flags |= FREE_IMAGE_LOAD_FLAGS.RAW_DISPLAY; } bool usethumb = ("true".Equals(settings["usepreview"], StringComparison.OrdinalIgnoreCase)); if (usethumb) { flags |= FREE_IMAGE_LOAD_FLAGS.RAW_PREVIEW; } bool autorotate = ("true".Equals(settings["autorotate"], StringComparison.OrdinalIgnoreCase)); if (autorotate) { flags |= FREE_IMAGE_LOAD_FLAGS.JPEG_EXIFROTATE; } int page = 0; if (!string.IsNullOrEmpty(settings["page"]) && !int.TryParse(settings["page"], NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out page)) { page = 0; } int frame = 0; if (!string.IsNullOrEmpty(settings["frame"]) && !int.TryParse(settings["frame"], NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out frame)) { frame = 0; } if (page == 0 && frame != 0) { page = frame; } Stopwatch sw = new Stopwatch(); sw.Start(); if (page > 1) { FREE_IMAGE_FORMAT fmt = FREE_IMAGE_FORMAT.FIF_UNKNOWN; FIMULTIBITMAP mb = FreeImage.OpenMultiBitmapFromStream(s, ref fmt, flags); //Prevent asking for a non-existent page int pages = FreeImage.GetPageCount(mb); if (page > pages) { page = pages; } try { if (mb.IsNull) { return(null); } FIBITMAP bPage = FreeImage.LockPage(mb, page - 1); if (bPage.IsNull) { return(null); } try { sw.Stop(); return(ToneMap(ref bPage, false, settings, callback)); } finally { FreeImage.UnlockPage(mb, bPage, false); } } finally { if (!mb.IsNull) { FreeImage.CloseMultiBitmapEx(ref mb, FREE_IMAGE_SAVE_FLAGS.DEFAULT); } } } else { FIBITMAP original = FIBITMAP.Zero; try { original = FreeImage.LoadFromStream(s, flags); sw.Stop(); if (original.IsNull) { return(null); } return(ToneMap(ref original, true, settings, callback)); } finally { if (!original.IsNull) { FreeImage.UnloadEx(ref original); } } } }
public static extern void UnlockPage(FIMULTIBITMAP bitmap, FIBITMAP data, bool changed);
// Сохраняет выделенные файлы в TIFF private void btnTIFF_Click(object sender, EventArgs e) { if (0 == listView1.SelectedItems.Count) { return; } bool deleteFiles = chkDeleteFiles.Checked; // Удалять jpeg'и после создания tiff savePDFDialog.Filter = "Файлы TIFF|*.tif;*.tiff"; savePDFDialog.InitialDirectory = PDFInitialDir; if (DialogResult.OK != savePDFDialog.ShowDialog()) { return; } Cursor.Current = Cursors.WaitCursor; // Вариант с FreeImage - быстро, но сложнее и иногда инвертирует цвета // Сохранить первую страницу FIBITMAP dib_color = FreeImage.LoadEx(scanFileNames[listView1.SelectedItems[0].Index]); FIBITMAP dib = FreeImage.ConvertToGreyscale(dib_color); FreeImage.UnloadEx(ref dib_color); if (FREE_IMAGE_COLOR_TYPE.FIC_MINISBLACK == FreeImage.GetColorType(dib)) { FreeImage.Invert(dib); } deleteFiles = FreeImage.SaveEx(ref dib, savePDFDialog.FileName, FREE_IMAGE_FORMAT.FIF_TIFF, FREE_IMAGE_SAVE_FLAGS.TIFF_CCITTFAX4, FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP, true); FreeImage.UnloadEx(ref dib); if (listView1.SelectedItems.Count > 1) { string tmpFile = Path.GetTempFileName() + ".tif"; FIBITMAP fib; FIBITMAP fib_color; FIMULTIBITMAP fmb = FreeImage.OpenMultiBitmapEx(savePDFDialog.FileName); // Добавить остальные страницы for (int i = 1; i < listView1.SelectedItems.Count; i++) { fib_color = FreeImage.LoadEx(scanFileNames[listView1.SelectedItems[i].Index]); fib = FreeImage.ConvertToGreyscale(fib_color); FreeImage.UnloadEx(ref fib_color); if (FREE_IMAGE_COLOR_TYPE.FIC_MINISBLACK == FreeImage.GetColorType(fib)) { FreeImage.Invert(fib); } FreeImage.SaveEx(ref fib, tmpFile, FREE_IMAGE_FORMAT.FIF_TIFF, FREE_IMAGE_SAVE_FLAGS.TIFF_CCITTFAX4, FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP, true); fib = FreeImageAPI.FreeImage.LoadEx(tmpFile); FreeImage.AppendPage(fmb, fib); FreeImage.UnloadEx(ref fib); File.Delete(tmpFile); } deleteFiles = FreeImage.CloseMultiBitmapEx(ref fmb); } /* * // Вариант с ImageMagick - проще, но очень медленно * int s = 0; * * MagickImageCollection images = new MagickImageCollection(); * foreach (ListViewItem item in listView1.SelectedItems) * { * images.Add(scanFileNames[item.Index]); * images[s].Strip(); // По аналогии с PDF на всякий случай * images[s].Format = MagickFormat.Tif; * images[s].Settings.Compression = CompressionMethod.Group4; * images[s].Depth = 1; * s++; * } * try * { * images.Write(savePDFDialog.FileName, MagickFormat.Tif); * } * catch (MagickException me) * { * toolStripStatus.Text = me.Message; * deleteFiles = false; * } * images.Dispose(); */ if (deleteFiles) { btnDelete_Click(btnPDF, null); } Cursor.Current = Cursors.Default; }
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!"); } }
/// <summary> /// Closes a previously opened multi-page bitmap and, when the bitmap was not opened read-only, /// applies any changes made to it. /// On success the handle will be reset to null. /// </summary> /// <param name="dib">Handle to a FreeImage multi-paged bitmap.</param> /// <param name="flags">Flags to enable or disable plugin-features.</param> /// <returns>Returns true on success, false on failure.</returns> public static bool CloseMultiBitmapEx(ref FIMULTIBITMAP dib, FREE_IMAGE_SAVE_FLAGS flags) { bool result = false; if (!dib.IsNull) { if (CloseMultiBitmap(dib, flags)) { dib = 0; result = true; } } return result; }
/// <summary> /// Closes a previously opened multi-page bitmap and, when the bitmap was not opened read-only, /// applies any changes made to it. /// On success the handle will be reset to null. /// </summary> /// <param name="dib">Handle to a FreeImage multi-paged bitmap.</param> /// <returns>Returns true on success, false on failure.</returns> public static bool CloseMultiBitmapEx(ref FIMULTIBITMAP dib) { return CloseMultiBitmapEx(ref dib, FREE_IMAGE_SAVE_FLAGS.DEFAULT); }
/// <summary> /// Retrieves a list locked pages of a multi-paged bitmap. /// </summary> /// <param name="dib">Handle to a FreeImage multi-paged bitmap.</param> /// <returns>List containing the indexes of the locked pages.</returns> /// <exception cref="ArgumentNullException"> /// <paramref name="dib"/> is null.</exception> public static int[] GetLockedPages(FIMULTIBITMAP dib) { if (dib.IsNull) { throw new ArgumentNullException("dib"); } // Get the number of pages and create an array to save the information int count = 0; int[] result = null; // Get count if (GetLockedPageNumbers(dib, result, ref count)) { result = new int[count]; // Fill array if (!GetLockedPageNumbers(dib, result, ref count)) { result = null; } } return result; }
/// <summary> /// Retrieves the number of pages that are locked in a multi-paged bitmap. /// </summary> /// <param name="dib">Handle to a FreeImage multi-paged bitmap.</param> /// <returns>Number of locked pages.</returns> /// <exception cref="ArgumentNullException"> /// <paramref name="dib"/> is null.</exception> public static int GetLockedPageCount(FIMULTIBITMAP dib) { if (dib.IsNull) { throw new ArgumentNullException("dib"); } int result = 0; GetLockedPageNumbers(dib, null, ref result); return result; }
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!"); } }
public static extern bool MovePage(FIMULTIBITMAP bitmap, int target, int source);
public static extern long CloseMultiBitmap(FIMULTIBITMAP bitmap, int flags);
private static extern bool CloseMultiBitmap_(FIMULTIBITMAP bitmap, FREE_IMAGE_SAVE_FLAGS flags);
public static extern void UnlockPage(FIMULTIBITMAP bitmap, int page, bool changed);
public static extern void DeletePage(FIMULTIBITMAP bitmap, int page);
public static extern bool GetLockedPageNumbers(FIMULTIBITMAP bitmap, IntPtr pages, IntPtr count);
public static extern int GetPageCount(FIMULTIBITMAP bitmap);
public static extern bool GetLockedPageNumbers(FIMULTIBITMAP bitmap, int[] pages, ref int count);
public static extern void InsertPage(FIMULTIBITMAP bitmap, int page, FIBITMAP data);
public static extern int GetPageCount(FIMULTIBITMAP bitmap);
public static extern FIBITMAP LockPage(FIMULTIBITMAP bitmap, int page);
public static extern void InsertPage(FIMULTIBITMAP bitmap, int page, FIBITMAP data);
public static extern bool MovePage(FIMULTIBITMAP bitmap, int target, int source);
public static extern FIBITMAP LockPage(FIMULTIBITMAP bitmap, int page);
//private void ergDir(string path, ref List<string> lstPath) { // if(!Directory.Exists(path)) { // return; // } // DirectoryInfo info = new DirectoryInfo(path); // foreach(FileInfo NextFile in info.GetFiles()) { // if(NextFile.Name == "0-0-11.grid") // continue; // // 获取文件完整路径 // string heatmappath = NextFile.FullName; // } //} public string convert(string[] srcMultiPath, string dstDir, string multiSizeBpp, string outType = "auto", string operate = "rename", bool mergeOutput = false) { string rstInfo = "Success"; //HashSet<int> hsIconSize = new HashSet<int>(); //for(int i = 0; i < lstSupportIconSize.Length; ++i) { // hsIconSize.Add(lstSupportIconSize[i]); //} //HashSet<int> hsBpp = new HashSet<int>(); //for(int i = 0; i < lstSupportBpp.Length; ++i) { // hsBpp.Add(lstSupportBpp[i]); //} List <int> lstIcoSize = new List <int>(); List <int> lstIcoBpp = new List <int>(); // check param : outType if (!hsSupportOutType.Contains(outType)) { return(getErrorInfo(outType)); } // check param : operate if (!hsSupportOperate.Contains(operate)) { return(getErrorInfo(operate)); } // format param : size & bpp; string[] arr = multiSizeBpp.Split(new string[] { ";", ";" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < arr.Length; ++i) { string[] arr2 = arr[i].Split(new string[] { ",", "," }, StringSplitOptions.RemoveEmptyEntries); if (arr2.Length <= 0) { continue; } int size; int bpp = 32; bool isOk = int.TryParse(arr2[0], out size); if (!isOk || !hsIconSize.Contains(size)) { return(getErrorInfo(multiSizeBpp)); } if (arr2.Length >= 2) { isOk = int.TryParse(arr2[1], out bpp); if (!isOk) { return(getErrorInfo(multiSizeBpp)); } } if (!hsBpp.Contains(bpp)) { return(getErrorInfo(multiSizeBpp)); } lstIcoSize.Add(size); lstIcoBpp.Add(bpp); } if (lstIcoSize.Count == 0) { lstIcoSize.Add(48); lstIcoBpp.Add(32); } //List<string> lstSrcPath = new List<string>(); //for(int i = 0; i < srcMultiPath.Length; ++i) { // if(Directory.Exists(path)) { // continue; // } //} for (int j = 0; j < srcMultiPath.Length; ++j) { List <DibMd> lstData = new List <DibMd>(); string path = srcMultiPath[j]; if (!File.Exists(path) && !Directory.Exists(path)) { continue; } string suffix = Path.GetExtension(path).ToLower(); string dir = Path.GetDirectoryName(path) + "/"; if (dstDir != "") { dir = dstDir + "/"; Directory.CreateDirectory(dir); } string outSuffix = getOutFileSuffix(suffix, outType); // 只有输出格式ico的才能合并输出 bool realMergeOutput = mergeOutput; if (outSuffix != ".ico") { realMergeOutput = false; } string mergeDstPath = dir + Path.GetFileNameWithoutExtension(path) + outSuffix; if (realMergeOutput) { if (File.Exists(mergeDstPath)) { switch (operate) { case "jump": continue; case "overwrite": break; case "cancel": return("Cancel"); case "rename": default: mergeDstPath = renameDstFileName(mergeDstPath); break; } } } for (int i = 0; i < lstIcoSize.Count; ++i) { //if(Directory.Exists(path)) { // continue; //} string fname = Path.GetFileNameWithoutExtension(path); if (!realMergeOutput && !isDefaultIcon(lstIcoSize[i], lstIcoBpp[i])) { fname = $"{fname}_{lstIcoSize[i]}_{lstIcoBpp[i]}"; } string dstPath = dir + fname + outSuffix; if (File.Exists(dstPath)) { switch (operate) { case "jump": continue; case "overwrite": break; case "cancel": return("Cancel"); case "rename": default: dstPath = renameDstFileName(dstPath); break; } } //convert(path, dstPath, lstIcoSize[i], lstIcoBpp[i]); try { DibMd md = loadFile(path, lstIcoSize[i]); DibMd outMd = formatOutput(md, lstIcoSize[i], lstIcoBpp[i]); md?.Dispose(); if (outMd == null) { continue; } if (realMergeOutput) { lstData.Add(outMd); } else { save(outMd, dstPath); } } catch (Exception) { } } // 合并输出 if (realMergeOutput && lstData.Count > 0) { try { FIMULTIBITMAP fmb = FreeImage.OpenMultiBitmap(FREE_IMAGE_FORMAT.FIF_ICO, mergeDstPath, true, false, false, FREE_IMAGE_LOAD_FLAGS.ICO_MAKEALPHA); for (var i = 0; i < lstData.Count; ++i) { FreeImage.AppendPage(fmb, lstData[i].dib); lstData[i].Dispose(); } lstData.Clear(); FreeImage.CloseMultiBitmapEx(ref fmb, FREE_IMAGE_SAVE_FLAGS.BMP_SAVE_RLE); } catch (Exception) { } } } return(rstInfo); }
private void bwImport_DoWork(object sender, DoWorkEventArgs e) { bwImport.ReportProgress(0, ""); while (true) { String fptry = null; lock (importFiles) { if (importFiles.Count == 0) { break; } fptry = importFiles[0]; importFiles.RemoveAt(0); } String fpTIF = null; bool isPDF = false; if (FIUt.IsPDF(fptry)) { fpTIF = tempFiles.NewFile(".tif"); bwImport.ReportProgress(0, "PDF 画像変換"); if (!PDFUt.PDF2TIF(fptry, fpTIF, null, sizeThumb.Width, null)) { continue; } isPDF = true; } else { fpTIF = fptry; } if (fpTIF != null) { #if true FIMULTIBITMAP tif = FreeImage.OpenMultiBitmapEx(fpTIF, true, false); List <PicProvider> providers = new List <PicProvider>(); try { int nPages = FreeImage.GetPageCount(tif); for (int x = 0; x < nPages; x++) { FIBITMAP dib = FreeImage.LockPage(tif, x); try { FIBITMAP thumb = FreeImage.MakeThumbnail(dib, sizeThumb.Width, true); try { bwImport.ReportProgress(0, String.Format("{0}/{1} from {2}", 1 + x, nPages, fptry)); providers.Add(new PicProvider(FreeImage.GetBitmap(thumb), fpTIF, isPDF ? fptry : null, x, FreeImage.GetBPP(dib) == 1)); } finally { FreeImage.UnloadEx(ref thumb); } } finally { FreeImage.UnlockPage(tif, dib, false); } } } finally { FreeImage.CloseMultiBitmapEx(ref tif); } foreach (PicProvider pp in providers) { AddPage(pp); } #else using (Bitmap pic = new Bitmap(fpTIF)) { int nPages = pic.GetFrameCount(FrameDimension.Page); for (int x = 0; x < nPages; x++) { pic.SelectActiveFrame(FrameDimension.Page, x); AddPage(new PicProvider(ThumbUtil.Make(pic, sizeThumb), fpTIF, isPDF ? fptry : null, x, pic.PixelFormat == PixelFormat.Format1bppIndexed)); } } #endif } } }