Tôi đang cố gắng tạo hình nền và đang sử dụng chuyển đổi HSV trong lớp "android.graphics.color". Tôi đã rất ngạc nhiên khi tôi nhận ra rằng một chuyển đổi của một màu HSV tạo ra với một màu sắc quy định (0..360) cho một màu rgb (một số nguyên) và một chuyển đổi trở lại màu HSV sẽ không dẫn đến cùng một màu sắc. Đây là mã của tôi:Chuyển đổi HSV không chính xác trên Android
int c = Color.HSVToColor(new float[] { 100f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
Tôi bắt đầu với màu 100 độ và kết quả là 99.76471. Tôi tự hỏi tại sao có (theo ý kiến của tôi) tương đối không chính xác lớn.
Nhưng vấn đề lớn hơn nhiều là khi bạn đặt lại giá trị đó trong mã, kết quả mới sẽ giảm một lần nữa.
int c = Color.HSVToColor(new float[] { 99.76471f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
Nếu tôi bắt đầu với 99.76471, tôi nhận được 99.52941. Đây là một vấn đề đối với tôi. Tôi đã làm một cái gì đó tương tự trong java với lớp "java.awt.Color", nơi tôi không có những vấn đề đó. Thật không may, tôi không thể sử dụng lớp này trong android.
Tôi * tin rằng đây là trường hợp của một chuyển đổi khác được sử dụng giữa số nguyên 16 và 32 bit, tuy nhiên điều này có thể là cách tắt. Tôi nhớ một số năm trước đây đang gặp sự cố với các tệp âm thanh và chuyển đổi từ một mảng byte. Cuối cùng tôi chỉ làm tròn hình lên đến toàn bộ int gần nhất. – dave
Tôi ủng hộ ý tưởng của dave. Một điều có thể hữu ích là nhận thấy rằng sự khác biệt giữa giá trị ban đầu của 100 và kết quả được làm tròn của 99.76471 là 60/255 và 255 = 2^8-1 (Nó khá phổ biến để lưu trữ giá trị rgb trên 8 bit) . Điều này cũng đúng với 99.76471 và 99.52941. Tôi không có một lý thuyết hoàn chỉnh, nhưng có vẻ như số học cơ bản đã đi sai. – elias