BufferedImage.setRGB piksel noto'g'ri rang

Bir xaritani 512x512 pngga teng ravishda oddiyroq bir narsa qilishga harakat qilsam, ballarni chizishga harakat qilaman. Mening kodim juda sodda, men ham setRGB funktsiyasidan, ham createGraphics funktsiyasi tomonidan qaytarilgan Graphics2D ob'ektidan foydalanib harakat qildim. Men oddiy bir narsaga qaramasligim kerak. EDIT: Yangi BufferedImage yaratishni istamayotganimni eslatib o'tmoqchiman, mavjud BufferedImage-ni o'zgartirishni qidiraman, chunki navbatdagi kutubxona murojaatlari men bilan ishlayotgan BufferedImage-ni o'zgartiradi. (Quyidagi misol kodi orqali buferi kelib chiqadigan faylni fayldan o'qib chiqdim, masalani replikatsiya qilishning oddiy usuli.

            File outputImage = new File("before.png");
            BufferedImage img = ImageIO.read(outputImage);


            img.setRGB(255, 255, new Color(0f, 1f, 0).getRGB());

            File after = new File("after.png");
            ImageIO.write(img, "png", after);

Olingan pikselni kattalashtiradigan bo'lsangiz, u yashil emas, biroq quyuqroq kulrang. Ushbu xatti-harakatlar Graphics2D bilan bir xil bo'lgani uchun, men bu muammoni hal etishga ham umid qilaman.

before.png after.png

1
Muammo shundaki, asl tasvirni IndexColorModel (yoki rang xaritasi yoki "palitrasi") ishlatadi. Siz ko'rsatgan rangga mos rang mavjud emas, shuning o'rniga rang modeli sizga "eng yaqin" rangni siz ko'rsatganiga ko'ra olish uchun qo'ng'iroqni amalga oshiradi. @ camickr echimi yaxshi ishlaydi, garchi bu model rangi emas, balki bo'sh joy (ular ikkala RGB). ;-)
qo'shib qo'ydi muallif haraldK, manba

6 javoblar

BufferedImage ning rang maydoni muammo yaratishi kerak.

Quyidagi kodda asl tasvirni ishlatib, uni bufferedImagega belgilangan ranglar bilan bo'yashim mumkin:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;

public class SSCCE extends JPanel
{
    SSCCE()
    {
        try
        {
            BufferedImage original = ImageIO.read( new File("map.png") );
            int width = original.getWidth(null);
            int height = original.getHeight(null);
            int size = 100;
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = bi.createGraphics();
            g2d.drawImage(original, 0, 0, null);

            int color = new Color(0f, 1f, 0f).getRGB();
            bi.setRGB(10, 10, color);
            bi.setRGB(10, 11, color);
            bi.setRGB(11, 10, color);
            bi.setRGB(11, 11, color);
            add( new JLabel( new ImageIcon(bi) ) );
        }
        catch(Exception e2) {}
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}
3
qo'shib qo'ydi
Agar u ushbu rasmlarni yaratish uchun kutubxonadan foydalansa, ehtimol ular avval "haqiqiy rang" shaklida ko'rsatiladi, keyinchalik ranglarning kamayishi/ranglari xaritada ko'rsatiladi. Agar ular qat'iy sxemasidan foydalanmasalar, yondashuv ishlamaydi (okeanning o'rtasida yashil doira rejalashtirishga harakat qiling, masalan, palitra ko'k bo'lsa). : - /
qo'shib qo'ydi muallif haraldK, manba
@ParthMehrotra BufferedImage sizda cheklangan ranglarga ega (rang kodi, IndexColorModel ). Mavjud BufferedImage xususiyatini o'zgartira olmaysiz, shuning uchun siz yashil rangni bo'yashingiz mumkin emas. Men bilganimning yagona yo'li uni o'zgartirish, @camickr taklif qiladi. Ammo, ehtimol, ushbu konvertatsiya qilishni "upstream" (ya'ni, o'rnatishdan so'ng) amalga oshirishingiz mumkin va agar siz tasviringizni o'zgartirib yubormasangiz, faqatgina aylangan tasvirni ishlatish kerakmi?
qo'shib qo'ydi muallif haraldK, manba
Rangni vahiyning ranglariga mos keladigan qilib qo'yadigan bo'lsam, unda men osongina bo'yoqni bo'yashim mumkin. Ochiq yashil rang uchun yangi rang (0.8f, 0.9019608f, 0.6392157f) yoki 0xffcce6a3 harakat qilib ko'ring. Ochiq ko'k uchun yangi rang (0.6392157f, 0.8f, 1f) yoki 0xffa3ccff . Agar colorModel IndexColorModel bo'lsa, int [] rgbs = new int [colorModel.getMapSize ()] dan foydalanishingiz mumkin; colorModel.getRGBs (rgbs); rangli xarita ranglarini olish uchun .
qo'shib qo'ydi muallif haraldK, manba
@haraldK, mening taklifimni tushunganingiz uchun tashakkur. Ushbu "kutubxona" nima bo'lsa, O'X haqida gapiradi. "Kutubxona" "kutubxona" ga yuklanganida tasvirni o'zgartirishi mumkin va keyinchalik "kutubxona" tasviriga kiradigan boshqa jarayonlar bir xil ishlangan tasvirni ishlatadi.
qo'shib qo'ydi muallif camickr, manba
@haraldK, sizda cheklangan ranglar majmuasi mavjud - Men ba'zi tadqiqotlar qilishga harakat qildim va bu 256 rangni qo'llab-quvvatlagan edi, shuning uchun men hali ham bir savolga qanday qilib rangni 256. Men 0 dan 255 gacha qiymatlarni ishlatishga harakat qildim, biroq ularning hammasi bir xil (yoki kulrang) rangga aylandilar. "Yashil" (yoki yashil ranglar) ko'rsatilmagan bo'lsa ham, ko'k ranglar mavjud. Men hatto bo'yash uchun ko'k rangni ham topolmadim. Buni qanday qilish haqida har qanday fikr bormi?
qo'shib qo'ydi muallif camickr, manba
@ParthMehrotra, Mening talabim bir nechta nuqtani tuzishdir. - tasvirni nusxasini birinchi o'qiyotganingizda buni bajarishingizga xalaqit bermaydi, shuning uchun men hali ham muammolarni tushunmayapman. Hech qachon biror faylga biror narsa yozishni hech qachon eslatib qo'yganim yo'q. - siz kiritgan kod yangilangan tasvirni faylga saqlashni ko'rsatadi.
qo'shib qo'ydi muallif camickr, manba
@haraldK, thanks to ColorModelni yaxshiroq tushunishga harakat qilish uchun getRGBs (...) ga qarayman. Siz OPning javobidan foydalanishingiz mumkin deb o'ylashingiz mumkin. Color.GREEN qo'llab-quvvatlanmagan bo'lsa ham, yashil rangning boshqa bir soyasi ishlaydi deb o'ylarsiz.
qo'shib qo'ydi muallif camickr, manba
@ParthMehrotra, men sizga eng yaxshi echimni berdi. ColorSpaces'in qanday ishlashini bilmayman yoki ikkalasi o'rtasida qanday qilib aylantirilishini bilmayman. BufferedImage API-ni o'qib, ColorSpace-ga qarang. Ehtimol, biror narsani tushunishingiz mumkin. Sizning talabingiz rasmni faylga saqlash edi. Asl rasmning asl nusxasini yaratishni birinchi o'ringa qo'yish muhimligini ko'rmayapman. Eng muhimi, bu o'zgarishdagi rasm faylga saqlanadi.
qo'shib qo'ydi muallif camickr, manba
Nima haqida bahslashayotganimizga amin emasman. Yuqorida aytib o'tganimdek, mavjud BufferedImage bilan shug'ullanish kerak, chunki men foydalanadigan kutubxona BufferedImage'dan foydalanishni davom ettiradi. Men bu masalani aks ettirish uchun savolni tahrirladim.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Sizning javobingizni bekor qildingiz, chunki bu menga yordam berdi va ehtimol, kelajakda kimgadir yordam beradi, ammo qabul qilingan javob bufferedImage bilan ishlashga to'g'ri keladi, men bugun qabul qilingan javobni berishga harakat qilaman.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Xo'sh, mening talabim bir nechta nuqtalarni tuzishdir, men hech qachon biror faylga hech narsa yozmaslik haqida eslatib o'tmaganman. Menga bu mavzuni rang-barangligi sababli yo'naltirayotganingiz uchun tashakkur. Sizning tadqiq qilishim mumkin bo'lgan narsadir. Lekin, afsuski, bu mening muammomni hal qilmaydi.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Rahmat, lekin mavjud BufferedImage bilan buni qilishning biron bir usuli bormi? Yangi mahsulot yaratmasdanmi? Kutubxona chaqiruvidan BufferedImage ni olaman va uni o'zgartirishim kerak, buning o'rnini yangi yaratishingiz kerak.
qo'shib qo'ydi muallif Parth Mehrotra, manba

BufferedImage ning rang maydoni muammo yaratishi kerak.

Quyidagi kodda asl tasvirni ishlatib, uni bufferedImagega belgilangan ranglar bilan bo'yashim mumkin:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;

public class SSCCE extends JPanel
{
    SSCCE()
    {
        try
        {
            BufferedImage original = ImageIO.read( new File("map.png") );
            int width = original.getWidth(null);
            int height = original.getHeight(null);
            int size = 100;
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = bi.createGraphics();
            g2d.drawImage(original, 0, 0, null);

            int color = new Color(0f, 1f, 0f).getRGB();
            bi.setRGB(10, 10, color);
            bi.setRGB(10, 11, color);
            bi.setRGB(11, 10, color);
            bi.setRGB(11, 11, color);
            add( new JLabel( new ImageIcon(bi) ) );
        }
        catch(Exception e2) {}
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}
3
qo'shib qo'ydi
Agar u ushbu rasmlarni yaratish uchun kutubxonadan foydalansa, ehtimol ular avval "haqiqiy rang" shaklida ko'rsatiladi, keyinchalik ranglarning kamayishi/ranglari xaritada ko'rsatiladi. Agar ular qat'iy sxemasidan foydalanmasalar, yondashuv ishlamaydi (okeanning o'rtasida yashil doira rejalashtirishga harakat qiling, masalan, palitra ko'k bo'lsa). : - /
qo'shib qo'ydi muallif haraldK, manba
@ParthMehrotra BufferedImage sizda cheklangan ranglarga ega (rang kodi, IndexColorModel ). Mavjud BufferedImage xususiyatini o'zgartira olmaysiz, shuning uchun siz yashil rangni bo'yashingiz mumkin emas. Men bilganimning yagona yo'li uni o'zgartirish, @camickr taklif qiladi. Ammo, ehtimol, ushbu konvertatsiya qilishni "upstream" (ya'ni, o'rnatishdan so'ng) amalga oshirishingiz mumkin va agar siz tasviringizni o'zgartirib yubormasangiz, faqatgina aylangan tasvirni ishlatish kerakmi?
qo'shib qo'ydi muallif haraldK, manba
Rangni vahiyning ranglariga mos keladigan qilib qo'yadigan bo'lsam, unda men osongina bo'yoqni bo'yashim mumkin. Ochiq yashil rang uchun yangi rang (0.8f, 0.9019608f, 0.6392157f) yoki 0xffcce6a3 harakat qilib ko'ring. Ochiq ko'k uchun yangi rang (0.6392157f, 0.8f, 1f) yoki 0xffa3ccff . Agar colorModel IndexColorModel bo'lsa, int [] rgbs = new int [colorModel.getMapSize ()] dan foydalanishingiz mumkin; colorModel.getRGBs (rgbs); rangli xarita ranglarini olish uchun .
qo'shib qo'ydi muallif haraldK, manba
@haraldK, sizda cheklangan ranglar majmuasi mavjud - Men ba'zi tadqiqotlar qilishga harakat qildim va bu 256 rangni qo'llab-quvvatlagan edi, shuning uchun men hali ham bir savolga qanday qilib rangni 256. Men 0 dan 255 gacha qiymatlarni ishlatishga harakat qildim, biroq ularning hammasi bir xil (yoki kulrang) rangga aylandilar. "Yashil" (yoki yashil ranglar) ko'rsatilmagan bo'lsa ham, ko'k ranglar mavjud. Men hatto bo'yash uchun ko'k rangni ham topolmadim. Buni qanday qilish haqida har qanday fikr bormi?
qo'shib qo'ydi muallif camickr, manba
@haraldK, mening taklifimni tushunganingiz uchun tashakkur. Ushbu "kutubxona" nima bo'lsa, O'X haqida gapiradi. "Kutubxona" "kutubxona" ga yuklanganida tasvirni o'zgartirishi mumkin va keyinchalik "kutubxona" tasviriga kiradigan boshqa jarayonlar bir xil ishlangan tasvirni ishlatadi.
qo'shib qo'ydi muallif camickr, manba
@ParthMehrotra, Mening talabim bir nechta nuqtani tuzishdir. - tasvirni nusxasini birinchi o'qiyotganingizda buni bajarishingizga xalaqit bermaydi, shuning uchun men hali ham muammolarni tushunmayapman. Hech qachon biror faylga biror narsa yozishni hech qachon eslatib qo'yganim yo'q. - siz kiritgan kod yangilangan tasvirni faylga saqlashni ko'rsatadi.
qo'shib qo'ydi muallif camickr, manba
@haraldK, thanks to ColorModelni yaxshiroq tushunishga harakat qilish uchun getRGBs (...) ga qarayman. Siz OPning javobidan foydalanishingiz mumkin deb o'ylashingiz mumkin. Color.GREEN qo'llab-quvvatlanmagan bo'lsa ham, yashil rangning boshqa bir soyasi ishlaydi deb o'ylarsiz.
qo'shib qo'ydi muallif camickr, manba
@ParthMehrotra, men sizga eng yaxshi echimni berdi. ColorSpaces'in qanday ishlashini bilmayman yoki ikkalasi o'rtasida qanday qilib aylantirilishini bilmayman. BufferedImage API-ni o'qib, ColorSpace-ga qarang. Ehtimol, biror narsani tushunishingiz mumkin. Sizning talabingiz rasmni faylga saqlash edi. Asl rasmning asl nusxasini yaratishni birinchi o'ringa qo'yish muhimligini ko'rmayapman. Eng muhimi, bu o'zgarishdagi rasm faylga saqlanadi.
qo'shib qo'ydi muallif camickr, manba
Nima haqida bahslashayotganimizga amin emasman. Yuqorida aytib o'tganimdek, mavjud BufferedImage bilan shug'ullanish kerak, chunki men foydalanadigan kutubxona BufferedImage'dan foydalanishni davom ettiradi. Men bu masalani aks ettirish uchun savolni tahrirladim.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Sizning javobingizni bekor qildingiz, chunki bu menga yordam berdi va ehtimol, kelajakda kimgadir yordam beradi, ammo qabul qilingan javob bufferedImage bilan ishlashga to'g'ri keladi, men bugun qabul qilingan javobni berishga harakat qilaman.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Xo'sh, mening talabim bir nechta nuqtalarni tuzishdir, men hech qachon biror faylga hech narsa yozmaslik haqida eslatib o'tmaganman. Menga bu mavzuni rang-barangligi sababli yo'naltirayotganingiz uchun tashakkur. Sizning tadqiq qilishim mumkin bo'lgan narsadir. Lekin, afsuski, bu mening muammomni hal qilmaydi.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Rahmat, lekin mavjud BufferedImage bilan buni qilishning biron bir usuli bormi? Yangi mahsulot yaratmasdanmi? Kutubxona chaqiruvidan BufferedImage ni olaman va uni o'zgartirishim kerak, buning o'rnini yangi yaratishingiz kerak.
qo'shib qo'ydi muallif Parth Mehrotra, manba

BufferedImage ning rang maydoni muammo yaratishi kerak.

Quyidagi kodda asl tasvirni ishlatib, uni bufferedImagega belgilangan ranglar bilan bo'yashim mumkin:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;

public class SSCCE extends JPanel
{
    SSCCE()
    {
        try
        {
            BufferedImage original = ImageIO.read( new File("map.png") );
            int width = original.getWidth(null);
            int height = original.getHeight(null);
            int size = 100;
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = bi.createGraphics();
            g2d.drawImage(original, 0, 0, null);

            int color = new Color(0f, 1f, 0f).getRGB();
            bi.setRGB(10, 10, color);
            bi.setRGB(10, 11, color);
            bi.setRGB(11, 10, color);
            bi.setRGB(11, 11, color);
            add( new JLabel( new ImageIcon(bi) ) );
        }
        catch(Exception e2) {}
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}
3
qo'shib qo'ydi
Agar u ushbu rasmlarni yaratish uchun kutubxonadan foydalansa, ehtimol ular avval "haqiqiy rang" shaklida ko'rsatiladi, keyinchalik ranglarning kamayishi/ranglari xaritada ko'rsatiladi. Agar ular qat'iy sxemasidan foydalanmasalar, yondashuv ishlamaydi (okeanning o'rtasida yashil doira rejalashtirishga harakat qiling, masalan, palitra ko'k bo'lsa). : - /
qo'shib qo'ydi muallif haraldK, manba
@ParthMehrotra BufferedImage sizda cheklangan ranglarga ega (rang kodi, IndexColorModel ). Mavjud BufferedImage xususiyatini o'zgartira olmaysiz, shuning uchun siz yashil rangni bo'yashingiz mumkin emas. Men bilganimning yagona yo'li uni o'zgartirish, @camickr taklif qiladi. Ammo, ehtimol, ushbu konvertatsiya qilishni "upstream" (ya'ni, o'rnatishdan so'ng) amalga oshirishingiz mumkin va agar siz tasviringizni o'zgartirib yubormasangiz, faqatgina aylangan tasvirni ishlatish kerakmi?
qo'shib qo'ydi muallif haraldK, manba
Rangni vahiyning ranglariga mos keladigan qilib qo'yadigan bo'lsam, unda men osongina bo'yoqni bo'yashim mumkin. Ochiq yashil rang uchun yangi rang (0.8f, 0.9019608f, 0.6392157f) yoki 0xffcce6a3 harakat qilib ko'ring. Ochiq ko'k uchun yangi rang (0.6392157f, 0.8f, 1f) yoki 0xffa3ccff . Agar colorModel IndexColorModel bo'lsa, int [] rgbs = new int [colorModel.getMapSize ()] dan foydalanishingiz mumkin; colorModel.getRGBs (rgbs); rangli xarita ranglarini olish uchun .
qo'shib qo'ydi muallif haraldK, manba
@haraldK, mening taklifimni tushunganingiz uchun tashakkur. Ushbu "kutubxona" nima bo'lsa, O'X haqida gapiradi. "Kutubxona" "kutubxona" ga yuklanganida tasvirni o'zgartirishi mumkin va keyinchalik "kutubxona" tasviriga kiradigan boshqa jarayonlar bir xil ishlangan tasvirni ishlatadi.
qo'shib qo'ydi muallif camickr, manba
@haraldK, sizda cheklangan ranglar majmuasi mavjud - Men ba'zi tadqiqotlar qilishga harakat qildim va bu 256 rangni qo'llab-quvvatlagan edi, shuning uchun men hali ham bir savolga qanday qilib rangni 256. Men 0 dan 255 gacha qiymatlarni ishlatishga harakat qildim, biroq ularning hammasi bir xil (yoki kulrang) rangga aylandilar. "Yashil" (yoki yashil ranglar) ko'rsatilmagan bo'lsa ham, ko'k ranglar mavjud. Men hatto bo'yash uchun ko'k rangni ham topolmadim. Buni qanday qilish haqida har qanday fikr bormi?
qo'shib qo'ydi muallif camickr, manba
@ParthMehrotra, Mening talabim bir nechta nuqtani tuzishdir. - tasvirni nusxasini birinchi o'qiyotganingizda buni bajarishingizga xalaqit bermaydi, shuning uchun men hali ham muammolarni tushunmayapman. Hech qachon biror faylga biror narsa yozishni hech qachon eslatib qo'yganim yo'q. - siz kiritgan kod yangilangan tasvirni faylga saqlashni ko'rsatadi.
qo'shib qo'ydi muallif camickr, manba
@haraldK, thanks to ColorModelni yaxshiroq tushunishga harakat qilish uchun getRGBs (...) ga qarayman. Siz OPning javobidan foydalanishingiz mumkin deb o'ylashingiz mumkin. Color.GREEN qo'llab-quvvatlanmagan bo'lsa ham, yashil rangning boshqa bir soyasi ishlaydi deb o'ylarsiz.
qo'shib qo'ydi muallif camickr, manba
@ParthMehrotra, men sizga eng yaxshi echimni berdi. ColorSpaces'in qanday ishlashini bilmayman yoki ikkalasi o'rtasida qanday qilib aylantirilishini bilmayman. BufferedImage API-ni o'qib, ColorSpace-ga qarang. Ehtimol, biror narsani tushunishingiz mumkin. Sizning talabingiz rasmni faylga saqlash edi. Asl rasmning asl nusxasini yaratishni birinchi o'ringa qo'yish muhimligini ko'rmayapman. Eng muhimi, bu o'zgarishdagi rasm faylga saqlanadi.
qo'shib qo'ydi muallif camickr, manba
Nima haqida bahslashayotganimizga amin emasman. Yuqorida aytib o'tganimdek, mavjud BufferedImage bilan shug'ullanish kerak, chunki men foydalanadigan kutubxona BufferedImage'dan foydalanishni davom ettiradi. Men bu masalani aks ettirish uchun savolni tahrirladim.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Sizning javobingizni bekor qildingiz, chunki bu menga yordam berdi va ehtimol, kelajakda kimgadir yordam beradi, ammo qabul qilingan javob bufferedImage bilan ishlashga to'g'ri keladi, men bugun qabul qilingan javobni berishga harakat qilaman.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Xo'sh, mening talabim bir nechta nuqtalarni tuzishdir, men hech qachon biror faylga hech narsa yozmaslik haqida eslatib o'tmaganman. Menga bu mavzuni rang-barangligi sababli yo'naltirayotganingiz uchun tashakkur. Sizning tadqiq qilishim mumkin bo'lgan narsadir. Lekin, afsuski, bu mening muammomni hal qilmaydi.
qo'shib qo'ydi muallif Parth Mehrotra, manba
Rahmat, lekin mavjud BufferedImage bilan buni qilishning biron bir usuli bormi? Yangi mahsulot yaratmasdanmi? Kutubxona chaqiruvidan BufferedImage ni olaman va uni o'zgartirishim kerak, buning o'rnini yangi yaratishingiz kerak.
qo'shib qo'ydi muallif Parth Mehrotra, manba

Bu erda sharhning muhokamasi asosida muammoning echimini topishning bir necha usulini ta'riflashga urinish kerak:

Muammo shundaki, asl tasvirni IndexColorModel (yoki rang xaritasi yoki "palitrasi") ishlatadi. Siz aniqlagan rangga mos rangsiz rang mavjud emas, shuning o'rniga rang modelingiz sizga "eng yaqin" rangini siz ko'rsatgan ma'lumotga ko'ra olish uchun qo'ng'iroqni amalga oshiradi (siz bu rang eng yaqin o'yin bo'lishiga rozi emas, lekin ishlatiladigan algoritm beriladi).

Rangni vahiyning rangiga mos keladigan qilib belgilasangiz, u rangi bo'yashingiz mumkin. Ochiq yashil rang uchun new color (0.8f, 0.9019608f, 0.6392157f) yoki RGB qiymati 0xffcce6a3 harakat qilib ko'ring. Ochiq ko'k uchun yangi rang (0.6392157f, 0.8f, 1f) yoki 0xffa3ccff dan foydalaning.

Agar siz ushbu qadriyatlarni qanday qilib topsam ekanimni bilib qolsangiz, bu erda izoh. Agar colorModel IndexColorModel bo'lsa, quyidagilarni foydalanishingiz mumkin:

int[] rgbs = new int[colorModel.getMapSize()]; 
colorModel.getRGBs(rgbs); 

rangli xarita ranglarini olish uchun. Ushbu ranglardan birini tanlash har doim ishlaydi.

Endi "agar siz" kutubxona "(siz ko'pgina tafsilotlarni oshkor qilmagan bo'lsangiz) bu rasmlarni yaratish uchun qattiq palitradan foydalanayotgan bo'lsangiz, siz yaxshi va siz aytib o'tgan ranglardan birini qo'llashingiz yoki ranglarini tanlang va mos keladigan narsani tanlang. Aks holda, eng yaxshi rangni dinamik tarzda topishingiz kerak. Va agar siz haqiqatdan ham omadsiz bo'lsangiz, hech qanday muvofiq rang bo'lmasligi mumkin (ya'ni, sizning xaritangizdagi hamma narsa okean, va faqatgina mavjud bo'lgan ko'k rang, yashil nuqta qurish mumkin emas). Keyinchalik kutubxonani o'zgartirishdan ko'ra, buni hal qilishning yana bir yo'li yo'q.

To'liq farqli yondashuv, rasmni haqiqiy rangga ( BufferedImage.TYPE_INT_RGB yoki TYPE_3BYTE_BGR ) vaqtinchalik o'zgartiradigan @ camickr echimiga o'xshash bo'lishi mumkin. keyin tasvirni asl nusxasini bo'yab tashlang. Ushbu ning ishlashi yaxshi bo'lishi sababi, kompozitsion mexanizmning titrash va yaxshi ranglarni qidirish algoritmini ishlatishi. Biroq, avvalgi xatboshida ta'riflanganidek, mavjud ranglar bilan bog'liq muammoga hali ham ega bo'lasiz.


Issiq sariq rangi va chiqishi yordamida kod misoli:

Color color = new Color(0.89411765f, 0.5686275f, 0.019607844f);
int argb = color.getRGB();

Graphics2D g = image.createGraphics();
try {
    g.setColor(color);
    g.fillRect(10, 10, 50, 50);
}
finally {
    g.dispose();
}

image with yellow rectangle

1
qo'shib qo'ydi

Bu erda sharhning muhokamasi asosida muammoning echimini topishning bir necha usulini ta'riflashga urinish kerak:

Muammo shundaki, asl tasvirni IndexColorModel (yoki rang xaritasi yoki "palitrasi") ishlatadi. Siz aniqlagan rangga mos rangsiz rang mavjud emas, shuning o'rniga rang modelingiz sizga "eng yaqin" rangini siz ko'rsatgan ma'lumotga ko'ra olish uchun qo'ng'iroqni amalga oshiradi (siz bu rang eng yaqin o'yin bo'lishiga rozi emas, lekin ishlatiladigan algoritm beriladi).

Rangni vahiyning rangiga mos keladigan qilib belgilasangiz, u rangi bo'yashingiz mumkin. Ochiq yashil rang uchun new color (0.8f, 0.9019608f, 0.6392157f) yoki RGB qiymati 0xffcce6a3 harakat qilib ko'ring. Ochiq ko'k uchun yangi rang (0.6392157f, 0.8f, 1f) yoki 0xffa3ccff dan foydalaning.

Agar siz ushbu qadriyatlarni qanday qilib topsam ekanimni bilib qolsangiz, bu erda izoh. Agar colorModel IndexColorModel bo'lsa, quyidagilarni foydalanishingiz mumkin:

int[] rgbs = new int[colorModel.getMapSize()]; 
colorModel.getRGBs(rgbs); 

rangli xarita ranglarini olish uchun. Ushbu ranglardan birini tanlash har doim ishlaydi.

Endi "agar siz" kutubxona "(siz ko'pgina tafsilotlarni oshkor qilmagan bo'lsangiz) bu rasmlarni yaratish uchun qattiq palitradan foydalanayotgan bo'lsangiz, siz yaxshi va siz aytib o'tgan ranglardan birini qo'llashingiz yoki ranglarini tanlang va mos keladigan narsani tanlang. Aks holda, eng yaxshi rangni dinamik tarzda topishingiz kerak. Va agar siz haqiqatdan ham omadsiz bo'lsangiz, hech qanday muvofiq rang bo'lmasligi mumkin (ya'ni, sizning xaritangizdagi hamma narsa okean, va faqatgina mavjud bo'lgan ko'k rang, yashil nuqta qurish mumkin emas). Keyinchalik kutubxonani o'zgartirishdan ko'ra, buni hal qilishning yana bir yo'li yo'q.

To'liq farqli yondashuv, rasmni haqiqiy rangga ( BufferedImage.TYPE_INT_RGB yoki TYPE_3BYTE_BGR ) vaqtinchalik o'zgartiradigan @ camickr echimiga o'xshash bo'lishi mumkin. keyin tasvirni asl nusxasini bo'yab tashlang. Ushbu ning ishlashi yaxshi bo'lishi sababi, kompozitsion mexanizmning titrash va yaxshi ranglarni qidirish algoritmini ishlatishi. Biroq, avvalgi xatboshida ta'riflanganidek, mavjud ranglar bilan bog'liq muammoga hali ham ega bo'lasiz.


Issiq sariq rangi va chiqishi yordamida kod misoli:

Color color = new Color(0.89411765f, 0.5686275f, 0.019607844f);
int argb = color.getRGB();

Graphics2D g = image.createGraphics();
try {
    g.setColor(color);
    g.fillRect(10, 10, 50, 50);
}
finally {
    g.dispose();
}

image with yellow rectangle

1
qo'shib qo'ydi

Bu erda sharhning muhokamasi asosida muammoning echimini topishning bir necha usulini ta'riflashga urinish kerak:

Muammo shundaki, asl tasvirni IndexColorModel (yoki rang xaritasi yoki "palitrasi") ishlatadi. Siz aniqlagan rangga mos rangsiz rang mavjud emas, shuning o'rniga rang modelingiz sizga "eng yaqin" rangini siz ko'rsatgan ma'lumotga ko'ra olish uchun qo'ng'iroqni amalga oshiradi (siz bu rang eng yaqin o'yin bo'lishiga rozi emas, lekin ishlatiladigan algoritm beriladi).

Rangni vahiyning rangiga mos keladigan qilib belgilasangiz, u rangi bo'yashingiz mumkin. Ochiq yashil rang uchun new color (0.8f, 0.9019608f, 0.6392157f) yoki RGB qiymati 0xffcce6a3 harakat qilib ko'ring. Ochiq ko'k uchun yangi rang (0.6392157f, 0.8f, 1f) yoki 0xffa3ccff dan foydalaning.

Agar siz ushbu qadriyatlarni qanday qilib topsam ekanimni bilib qolsangiz, bu erda izoh. Agar colorModel IndexColorModel bo'lsa, quyidagilarni foydalanishingiz mumkin:

int[] rgbs = new int[colorModel.getMapSize()]; 
colorModel.getRGBs(rgbs); 

rangli xarita ranglarini olish uchun. Ushbu ranglardan birini tanlash har doim ishlaydi.

Endi "agar siz" kutubxona "(siz ko'pgina tafsilotlarni oshkor qilmagan bo'lsangiz) bu rasmlarni yaratish uchun qattiq palitradan foydalanayotgan bo'lsangiz, siz yaxshi va siz aytib o'tgan ranglardan birini qo'llashingiz yoki ranglarini tanlang va mos keladigan narsani tanlang. Aks holda, eng yaxshi rangni dinamik tarzda topishingiz kerak. Va agar siz haqiqatdan ham omadsiz bo'lsangiz, hech qanday muvofiq rang bo'lmasligi mumkin (ya'ni, sizning xaritangizdagi hamma narsa okean, va faqatgina mavjud bo'lgan ko'k rang, yashil nuqta qurish mumkin emas). Keyinchalik kutubxonani o'zgartirishdan ko'ra, buni hal qilishning yana bir yo'li yo'q.

To'liq farqli yondashuv, rasmni haqiqiy rangga ( BufferedImage.TYPE_INT_RGB yoki TYPE_3BYTE_BGR ) vaqtinchalik o'zgartiradigan @ camickr echimiga o'xshash bo'lishi mumkin. keyin tasvirni asl nusxasini bo'yab tashlang. Ushbu ning ishlashi yaxshi bo'lishi sababi, kompozitsion mexanizmning titrash va yaxshi ranglarni qidirish algoritmini ishlatishi. Biroq, avvalgi xatboshida ta'riflanganidek, mavjud ranglar bilan bog'liq muammoga hali ham ega bo'lasiz.


Issiq sariq rangi va chiqishi yordamida kod misoli:

Color color = new Color(0.89411765f, 0.5686275f, 0.019607844f);
int argb = color.getRGB();

Graphics2D g = image.createGraphics();
try {
    g.setColor(color);
    g.fillRect(10, 10, 50, 50);
}
finally {
    g.dispose();
}

image with yellow rectangle

1
qo'shib qo'ydi