سؤال

وأنا أحاول قراءة ملف 16 بت لون الرمادي TIFF (BitsPerSample = 16) باستخدام برنامج C صغير لتحويلها إلى مجموعة من أرقام النقطة العائمة لمزيد من التحليل. البيانات بكسل هي، وفقا لمعلومات رأس، في شريط واحد من 2048x2048 بكسل. ترميز هو Endian طفيف.
مع أن معلومات رأس، كنت أتوقع أن يكون قادرا على قراءة كتلة واحدة من 2048x2048x2 بايت وتفسر على أنها 2048x2048 صحيحة 2 بايت. ما أنا في الواقع الحصول على غير صورة تنقسم إلى أربعة أجزاء من 1024x1024 بكسل لكل منهما، وهما أقل من التي تحتوي على الأصفار فقط. كل واحد من اثنين من كبار الأرباع تبدو وكأنها توقعت الصورة الكاملة للبحث: بديل النص http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457.png
إذا قرأت نفس الملف في الأعرج أو يماغيماغيك، سواء تخبرني أن لديهم للحد من 8 بت (والذي لا يساعدني - أنا في حاجة إلى مجموعة كاملة)، ولكن بكسل يحضر في الأماكن الصحيحة: <لأ href = "http://users.aber.ac.uk /ruw/unlinked/15_inRT_0p457_gimp.png "يختلط =" نوفولو noreferrer "> نص بديل http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457_gimp.png وهو ما يوحي بأن فكرتي حول كيفية ترتيب البيانات داخل قطاع واحد خاطئة. من ناحية أخرى، فإن الملف يجب أن يكون مهيأ بشكل صحيح من حيث المعلومات رأس وإلا سوف الأعرج لا الحق في الحصول عليها. أين أنا ذاهب خطأ؟

والناتج من tiffdump:
15_inRT_0p457.tiff:
السحر: 0x4949 الإصدار: 0x2a
الدليل 0: تعويض 8 (0x8) المقبل 0 (0)
ImageWidth (256) طويل (4) 1 <2048>
ImageLength (257) طويل (4) 1 <2048>
BitsPerSample (258) SHORT (3) 1 <16>
ضغط (259) SHORT (3) 1 <1>
قياس الضوء (262) SHORT (3) 1 <1>
StripOffsets (273) طويل (4) 1 <4096>
التوجه (274) SHORT (3) 1 <1>
RowsPerStrip (278) طويل (4) 1 <2048>
StripByteCounts (279) طويل (4) 1 <8388608>
XResolution (282) الرشيد (5) 1 <126،582>
YResolution (283) الرشيد (5) 1 <126،582>
ResolutionUnit (296) SHORT (3) 1 <3>
34710 (0x8796) طويل (4) 1 <0>
(بطاقة 34710 هي معلومات الكاميرا، للتأكد من هذا لا يجعل بطريقة أو بأخرى أي اختلاف، لقد ركزت مجموعة كاملة من نهاية الدليل ملف الصورة إلى بداية البيانات في 0x1000، والتي في الواقع لا يجعل أي فرق.)

هل كانت مفيدة؟

المحلول

ولقد وجدت مشكلة - كان في برنامجي C ...

وكنت قد الذاكرة المخصصة لمجموعة من صفقات الشراء واستخدام fread () لقراءة في البيانات:

#define PPR 2048;
#define BPP 2;
long *pix;
pix=malloc(PPR*PPR*sizeof(long));
fread(pix,BPP,PPR*PPR,in);

ولكن منذ تأتي البيانات في قطع 2 بايت (BPP = 2)، ولكن sizeof (الطويل) = 4، fread () حزم البيانات الكثيفة داخل الذاكرة المخصصة بدلا من تعبئتها إلى قطع طويلة الحجم. هكذا أنا في نهاية المطاف مع صفين معبأة معا في واحدة والنصف الثاني من الصورة فارغة.

ولقد تغييره إلى حلقة على عدد من بكسل وقراءة وحدتي بايت في كل مرة وتخزينها في الذاكرة المخصصة بدلا من ذلك:

for (m=0;m<PPR*PPR;m++) {
  b1=fgetc(in);
  b2=fgetc(in);
  *(pix+m)=256*b1+b2;
}

نصائح أخرى

وأنت تدرك أنه إذا StripOffsets هو صفيف، هو إزاحة إلى مجموعة من التعويضات، أليس كذلك؟ قد لا يكون فعل ذلك dereference صحيح.

ما هو النظام الأساسي الخاص بك؟ ماذا تحاول أن تفعل؟ إذا كنت على استعداد للعمل في .NET على ويندوز، شركتي تبيع مجموعة أدوات معالجة الصور يتضمن الترميز TIFF التي تعمل على حد كبير أي شيء يمكنك رمي في ذلك، وسيعود 16 صورة BPP. لدينا أيضا العديد من الأدوات التي تعمل أصلا على الصور 16bpp.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top