PDA

View Full Version : مبتدی: استفاده از libtiff برای تبدیل چند jpg به tiff



zhr.rezae66i
جمعه 21 فروردین 1394, 14:08 عصر
سلام . من یه کتابخانه دارم که حتما باید با اون کار کنم برای تبدیل چند jpg به tiff
حالا این کتابخانه برای ساخت یه فایل tiff بصورت زیر خودش تک تک پیکسل هارو تنظیم کرده. و عکس رو ساخته.
من میخام عکسی که میخام رو اضافه کنم اما نمیدونم چطور باید بسازمش
میشه ببینید شما میتونید کمکم کنید یا نه


const int numberOfPages = 4;

const int width = 256;
const int height = 256;
const int samplesPerPixel = 1;
const int bitsPerSample = 8;

const string fileName = "CreateMultipageTiff.tif";

byte[][] firstPageBuffer = new byte[height][];
for (int j = 0; j < height; j++)
{
firstPageBuffer[j] = new byte[width];
for (int i = 0; i < width; i++)
firstPageBuffer[j][i] = (byte)(j * i);
}

using (Tiff output = Tiff.Open(fileName, "w"))
{
for (int page = 0; page < numberOfPages; ++page)
{
output.SetField(TiffTag.IMAGEWIDTH, width / samplesPerPixel);
output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample);
output.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT);
output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);

if (page % 2 == 0)
output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);
else
output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISWHITE);

output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));
output.SetField(TiffTag.XRESOLUTION, 100.0);
output.SetField(TiffTag.YRESOLUTION, 100.0);
output.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH);

// specify that it's a page within the multipage file
output.SetField(TiffTag.SUBFILETYPE, FileType.PAGE);
// specify the page number
output.SetField(TiffTag.PAGENUMBER, page, numberOfPages);

for (int j = 0; j < height; ++j)
output.WriteScanline(firstPageBuffer[j], j);

output.WriteDirectory();
}
}

plus
جمعه 21 فروردین 1394, 16:12 عصر
اول بررسی کنید ببینید آیا شی Tiff امکان اضافه کردن یک تصویر به صورت مستقیم (بجای استفاده از WriteScanline) رو داره یا نه. اگه اینطور نیست، باید هر تصویر رو با یک شی Bitmap لود کنید و با متد LockBits به Scanline ها دسترسی پیدا کنید. آخرین حلقه رو باید با کد زیر جایگزین کنید:

Bitmap bitmap;
BitmapData bitmapData;
try {
string fileName = string.Format(@"c:\images\image{0}.jpeg", i);
bitmap = new Bitmap(fileName);
Rectangle rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
bitmapData = bitmap.LockBits(rectangle, ImageLockMode.ReadOnly, bitmap.PixelFormat);
int stride = bitmapData.Stride;
byte[] scanline = new byte[stride];
for (int j = 0; j < height; j++) {
IntPtr pScanline = new IntPtr(bitmapData.Scan0.ToInt64() + j * stride);
Marshal.Copy(pScanline, scanline, 0, scanline.Length);
output.WriteScanline(scanline, j);
}
}
finally {
if (bitmapData != null) {
bitmap.UnlockBits(bitmapData);
}
if (bitmap != null) {
bitmap.Dispose();
}
}

و البته مقدار bits per sample بسته به فرمت Bitmap مورد نظر متفاوت هست که باید در کد تغییرش بدین.

zhr.rezae66i
جمعه 21 فروردین 1394, 17:31 عصر
الان این کد مشکلش چیه
const int numberOfPages = 4;
string writefileName = @"111.tif";
string readfilename = @"Sample Data\f-lzw.tif";
using (Tiff output = Tiff.Open(writefileName, "w"))
{
for (int page = 0; page < numberOfPages; ++page)
{
using (Tiff image = Tiff.Open(readfilename, "r"))
{
FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
int width = value[0].ToInt();

value = image.GetField(TiffTag.IMAGELENGTH);
int height = value[0].ToInt();

Bitmap bitmap;
BitmapData bitmapData;
byte[] img = System.IO.File.ReadAllBytes(readfilename);
bitmap = new Bitmap(readfilename);
Rectangle rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
bitmapData = bitmap.LockBits(rectangle, ImageLockMode.ReadOnly, bitmap.PixelFormat);
int stride = bitmapData.Stride;
byte[] scanline = new byte[stride];
for (int j = 0; j < height; j++)
{
IntPtr pScanline = new IntPtr(bitmapData.Scan0.ToInt64() + j * stride);
Marshal.Copy(pScanline, scanline, 0, scanline.Length);
output.WriteScanline(scanline, j);
}
if (bitmapData != null)
{
bitmap.UnlockBits(bitmapData);
}
if (bitmap != null)
{
bitmap.Dispose();
}
output.WriteDirectory();
}
}
}
Process.Start(writefileName);
}

zhr.rezae66i
جمعه 21 فروردین 1394, 18:21 عصر
الان این کد مشکلش چیه
const int numberOfPages = 4;
string writefileName = @"111.tif";
string readfilename = @"Sample Data\marbles.tif";
using (Tiff output = Tiff.Open(writefileName, "w"))
{
for (int page = 0; page < numberOfPages; ++page)
{
using (Tiff image = Tiff.Open(readfilename, "r"))
{
FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
int width = value[0].ToInt();

value = image.GetField(TiffTag.IMAGELENGTH);
int height = value[0].ToInt();


Bitmap bitmap;
bitmap = new Bitmap(readfilename);

byte[] buffer = null;

buffer = getImageRasterBytes(bitmap, PixelFormat.Format24bppRgb);
int stride = buffer.Length / height;
convertRGBSamples(buffer, width, height);

for (int i = 0, offset = 0; i < height; i++)
{
output.WriteScanline(buffer, offset, i, 0);
offset += stride;
}
}
}
}
Process.Start(writefileName);