سؤال

أنا مبرمج جافا ذوي خبرة معقولة ولكن جديد نسبيا إلى Java2D. أحاول توسيع نطاق الصورة ولكني أحصل على نتائج ذات جودة رديئة. الصورة هي معاينة للوحة، لذلك تحتوي على أشياء مثل النصوص والنصوص. سأكون دائما تقدير، أبدا.

حاليا أنا أستخدم التعليمات البرمجية التالية: -

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);

حيث PaniceImage هي المعاينة الكاملة الحجم (BufferedImage) وتوسيع نطاق التكاليف والأبعاد المستهدفة المعنية. يبدو أنني فقدت الكثير من التفاصيل في نص وحواف الأشياء مثل TextFields إلخ.

هل هناك مكالمة أفضل يجب أن أستخدمها لتوسيع نطاق الصورة؟

شكرا يا جون

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

المحلول

اقتراح يمكنني أن أجعله هو تغيير حجم الصورة أولا BufferedImage. وبعد السبب يجري، Graphics2D موضوع BufferedImage يمكن الحصول عليها من أجل إنتاج صورة أفضل عالية الجودة.

Graphics2D يمكن قبول "التلميحات التقديم" مما يؤدي إلى تنفيذ طريقة معالجة الصور من قبل Graphics2D هدف. ال setRenderingHint الطريقة هي واحدة من الأساليب التي يمكن استخدامها لتعيين هذه التلميحات التقديمية. التلميحات التقديم من RenderingHints فئة يمكن استخدامها.

ثم، باستخدام ذلك Graphics2D كائن، يمكن رسم صورة إلى BufferedImage باستخدام تلميحات التقديم المحدد سابقا.

سيعمل رمز خشن (غير مختبر) كما يلي:

BufferedImage scaledImage = new BufferedImage(
    scaledWidth,
    scaledHeight,
    BufferedImage.TYPE_INT_RGB
);

Graphics2D g = scaledImage.createGraphics();
g.setRenderingHints(
    RenderingHints.Key.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();

قد تشمل تلميحات التسميات الأخرى:

ال السيطرة على تقديم الجودة يحتوي قسم البرامج التعليمية Java أيضا على مزيد من المعلومات حول كيفية التحكم في جودة التقديم Graphics2D أشياء.

وللصدر جيد جدا للمعلومات عن التعامل مع واجهات رسومية بشكل عام، عملاء غنيين قذرة من قبل شيت هاس ورومين الرجل ينصح بشدة. يوجد قسم واحد من الكتاب الذي يتعامل مع مسألة تحجيم الصور، والتي تبدو ذات صلة تماما.

نصائح أخرى

قد تكون يجب عليك الاتصال:

 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

و

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

Coobird صحيح أنك تحتاج إلى زيادة تدريجيا (يفضل استخدام BICubic) للحصول على نتيجة جيدة لتظهر مصغرة صغيرة بما يكفي. Image.getScaleDinstance المستخدمة للقيام بذلك مع نهج Area_AVERAGER، لكنها أبطأ بكثير من التراجع التزايدي الذي كان أصليا اقترحه كريس كامبل في "مخاطر Image.getScaledInstance ()".

يرجى عذير الترويج الذاتي هنا، لكنني تدحرجت حفنة من "أفضل ممارسات Java أفضل الممارسات" عندما يتعلق الأمر بتقييم الصورة في مكتبة تسمى imgscalr..

إنه متاح تحت رخصة Apache 2 والمصدر هو كل شيء على جيثب؛ كان الهدف من المكتبة هو جعل التحجيم للصور في أساليب جافا السهلة السهلة (الفئة الأولى، 5) وضمان أفضل النتيجة (وهو ما تريده أصلا)، أسرع نتيجة (كبيرة عند القياس بين الصور الكبيرة ) أو توازن بين الاثنين والسماح للمكتبة تقرر أي واحد يستخدم.

أردت فقط أن ليب يمكن "تغيير حجم صورتي والخروج من طريقي" وبعد قراءة جميع هذه الوظائف لبضعة أيام لأنني عالجت نقطة الألم (الخاصة بي كذلك) فقط كانت تدور حولها وتقاسم العمل لأي شخص آخر قد يساعد.

كوه لديه الفكرة الصحيحة. سأحاول أيضا RenderingHints.VALUE_INTERPOLATION_BILINEAR الاستيفاء ومعرفة ما إذا كان النزج يبحث. BICUBIC يعمل بشكل أفضل عند الارتفاع، رغم ذلك. للحصول على أفضل النتائج عند هاوزا، ينبغي للمرء تراجع في عدة خطوات. وبعد النصف الأول من القرار، ثم النصف مرة أخرى، وما إلى ذلك حتى تحصل بالقرب من الدقة المطلوبة (أي لا يمكنك النصف أو سوف تحصل على الصورة صغيرة جدا). الخطوة الأخيرة هي التوسيع على الدقة المطلوبة.

على سبيل المثال، دعنا نقول صورة الإدخال الخاصة بك 800 × 600. وتريد تراجع 160x120.:

  1. تراجع 50%. --> 400x300.
  2. تراجع 50%. --> 200x150.
  3. تراجع إلى 160x120..
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top