سؤال

في الآونة الأخيرة لقد كنت مهتما في تمثيل غير مضغوط الصور النقطية في الذاكرة.ولكن شيء واحد أنا غير متأكد من كيفية تنفيذ بشكل صحيح هو ثنائي الشفافية.E. g. ، لا تبدأ مع شيء من هذا القبيل:

struct RGBPixel {
 uint8_t red;
 uint8_t green;
 uint8_t blue;
};

struct bitmap {
 struct RGBPixel *data;
 size_t width;
 size_t height;
 size_t bytesPerPixel;
 size_t bytewidth;
 /* etc. */
};

أعتقد أن أبسط طريقة أن يكون هذا:

struct RGBPixel {
 uint8_t red;
 uint8_t green;
 uint8_t blue;
 bool transparent;
};

ولكن يبدو أن الإسراف قليلا (كما قد تضيف كاملة قناة ألفا).فقط إمكانية أخرى يمكنني التفكير به هو حجز أحد الألوان بأنها شفافة ، ولكن بعد ذلك تفقد القدرة على عرض هذا اللون.هل هناك طريقة قياسية من فعل هذا ؟

كيف صيغ مشتركة (GIF, 8 بت PNG, etc.) تمثل هذا ؟

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

المحلول

وهناك ألوان 16M، تعيين واحد منهم شفافة كما لن تكون مشقة كبيرة. إلا صورتك هي 16 ميغا بكسل، ويمكنك أن تتأكد من أنه لا حتى استخدام كل ألوان 16M على أي حال، مجرد اختيار واحد التي لم يتم استخدامها وجعلها لون الشفافية. إذا كان لديك صورة ضخمة يستخدم كل منهم، واختيار واحد الذي هو الأقل استخداما وتغييره إلى اللون المجاور، مما يجعلها غير المستخدمة.

وكما أشرت، في محاولة لتخزين بت واحد لكل بكسل مع البيانات بكسل RGB ليس الكفاءة. ربما يجب عليك إما تخزين كل بكسل RGB في مؤشر واحد ثم صورة نقطية من نفس H وأبعاد V في مؤشر آخر، أو يمكنك القيام صفاء القفل. هل يمكن تخزين البيانات مع R، G، B ونقطية الشفافية على حدة على النحو المذكور أعلاه ولكن هذا عادة غير فعالة للغاية عندما يتعلق الأمر رسم عليه.

نصائح أخرى

والمتحركة يستخدم لون محدد للشفافية. (على سبيل المثال: دعنا نقول 0xFFFF00 شفافة، لذلك كل بكسل مع هذا اللون سيكون عرض شفافة.) لا يمكن أن تستخدم هذه الألوان في هذه الصورة.
بابوا نيو غينيا لديه قناة ألفا، وهذا يعني كثافة آخر وهو ما يمثل قيمة ألفا من بكسل. (على سبيل المثال: 0 = تماما شفافة، 255 = مبهمة، 128 = نصف شفاف)

وعادة هناك قناة ألفا الرابعة لتمثيل الشفافية.

وأي بمعنى. بدلا من RBG، هل يمكن أن يكون RGBA.

ويسمى أيضا كروما القفل

والشفافية الثنائية. يمكنك تعيين لون ولون شفاف وفي وظيفة الرسم رسم بكسل إذا لونه ليس مفتاح صفاء (لون معين شفاف).

ولكل ألفا بكسل يستخدم عند القيام الشفافية متعددة المستويات مثل الظلال.

هل يمكن تخزين الشفافية في ذاكرة منفصلة ، أو حتى تخزين كل قناة على حدة ، على سبيل المثال:

struct bitmap {
 uint8_t *red;
 uint8_t *green;
 uint8_t *blue;
 uint8_t *transparency;
 // or packed: uint8_t *RGB, *transparency;
 size_t width;
 size_t height;
};

ثم تخصيص width*height / 8 بايت على قناة الشفافية ، وعلى افتراض 8 بت لكل قناة لون يمكنك الوصول إلى بت مثل هذا:

bool get_transparency( struct bitmap* bmp, size_t x, size_t y ) {
  size_t idx = y * bmp->width + x;
  size_t tidx = idx >> 3; // = idx / 8
  uint8_t t8 = (uint8_t)( idx & 7 ); // = idx % 8
  uint8_t mask = 1 << t8;
  return ( bmp->transparency[tidx] & mask ) != 0;
}

ملاحظة الوصول إلى البتات يمكن أن يكون الأمثل ، هذا هو مجرد مثال.

حل آخر:يمكنك انتقاد قليلا من واحدة من قنوات الألوان وتحديد البنية الخاصة بك مثل هذا:

struct RGBPixel {
 uint8_t red : 7;
 uint8_t transparency : 1;
 uint8_t green;
 uint8_g blue;
};

عند تخزين أو القراءة القناة الحمراء ، عليك أن الحجم تبعا لذلك ، على سبيل المثال red = (uint8_t)( ( (uint16_t)pix->red * 8 ) / 7 );

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